2013-01-04 86 views
0

我正在压缩视频,未来我想一次压缩多个帧。我有一个线程,我称它为每个框架上的工作 - 这就是为什么我有我的UI类循环。问题在于UI被阻止。为什么?这是因为我是从for循环调用线程吗?从循环块开始线程UI

代码导致UI块(Dialog.cpp):

for(int i=0; i<nFrames; i++) 
{ 
    //grab next frame from video source 

    myThread.setFrame(newFrame); 
    myThread.start(); 
    myThread.wait(); 
    result.append(myThread.GetResult()); 
} 
+4

开始一个单独的线程,并立即等待它有什么意义? –

+0

我使用了wait(),因为没有它,线程将立即通过for循环重新启动,不会产生任何结果。这不正确吗? –

+2

问题是,如果您立即阻止等待线程完成,线程中根本没有任何指向。您的单个线程化UI会阻塞并屈服到第二个线程,并继续屈服,直到第二个线程中的任务完成。在这种情况下,你可以完成工作的主线程。你不能像这样在循环中创建一个线程。您可能想要使用信号和插槽,QtConcurrent或线程池来完成此任务,但我没有时间来解释这两种解决方案。 – drescherjm

回答

7

你打电话wait,你为什么会想到wait不会阻止用户界面?

从Qt的文档:

块的线程,直到这两个条件被满足:

与此的QThread对象相关联的线程完成执行 (即,当它从运行返回()) 。线程完成后,该函数将返回true。如果线程还没有启动,它也会返回true。时间毫秒已经过去。如果时间是ULONG_MAX (默认值),那么等待永远不会超时(线程必须从run()返回 )。如果等待时间为 ,此函数将返回false。

+0

但是如果我不使用wait(),那么for循环会在它执行任何操作之前重新启动线程?我应该为每个框架使用一个新线程吗? –

+2

@PrimožKralj如果你想同时做多个事情,你需要多于一个线程。请注意,不受控制数量的线程是一个糟糕的主意,并且会比在单个线程中执行更慢。你可能需要像任务池,生产者 - 消费者队列等等。 – Yakk

+0

谢谢,会读入它。问候! –

2

From doc:

布尔的QThread ::等待(无符号长时间= ULONG_MAX)

块的线程,直到这两个条件被满足:

此相关的线程QThread对象已完成执行(即从run()返回时)。

...

这提供了类似的功能的POSIX 在pthread_join() 功能。

您不应该在这里使用wait