从for循环块UI启动线程

时间:2013-01-04 15:12:41

标签: c++ multithreading qt user-interface block

我正在压缩视频,将来我想一次压缩多个帧。我有一个线程,我称之为在每个帧上工作 - 这就是我在UI类中进行循环的原因。问题是UI被阻止了。为什么?这是因为我从for循环调用线程吗?

导致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());
}

2 个答案:

答案 0 :(得分:7)

您正在致电wait,为什么您认为wait不会阻止ui?

来自Qt docs:

  

阻止线程,直到满足以下任一条件:

     

与此QThread对象关联的线程已完成执行   (即从run()返回时)。如果,此函数将返回true   线程已经完成。如果线程没有,它也返回true   已经开始了。时间毫秒已过。如果时间是ULONG_MAX   (默认值),然后等待永远不会超时(线程必须   从run()返回)。如果等待时间,此函数将返回false   进行。

答案 1 :(得分:2)

From doc:

  

bool QThread :: wait(unsigned long time = ULONG_MAX)

     

阻止线程,直到满足以下任一条件:

     

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

     

...

     

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

您不应在此使用wait