实现线程以消耗Qt中的操作

时间:2009-10-12 14:18:55

标签: multithreading qt qt4

我从来没有在Qt中使用QThread,或者一般都没有使用过线程,所以这个主题对我来说更新。我仍然必须使用QThread,以避免由于一些繁重的计算而阻止我的主应用程序。

所以我想把我的繁重计算放在一个线程中,如果他们花了太多时间我想要杀掉这个帖子(这也是我的建议)。

我的帖子有以下声明:

class myopThread : public QThread
{
public:
    void run();
};

void myopThread::run()
   {

std::cout<<"here in the thread. Are you working?"<<endl;
    //include all the consuming operations here
exec();
}

我也在我的主应用程序中启动线程:

myopThread *t=new myopThread;
t->start();

似乎有效。现在,只要run()中的操作的计算时间大于2分钟,我就想杀死这个线程。

我不知道如何实现这一点。 任何帮助都会受到欢迎。

提前谢谢你, madalina

3 个答案:

答案 0 :(得分:1)

从狭隘的角度来看,你可以使用看门狗模式来实现你的问题,看门狗模式定期检查是否已经触发了线程关闭时间。 但这种方式会带来许多错误并花费时间。回顾使用QThreadPool的可能性 - 忘记了自己的线程分配/销毁管理

池的另一个好处是改进了线程创建的长期操作。而不是等待新线程只重用现有的线程。

答案 1 :(得分:1)

尝试使用计时器:

myopThread *t = new myopThread;
QTimer::singleShot(120000, myopThread, SLOT(terminate()));
t->start();

Qt's doc

  

void QThread :: terminate()[slot]

     

警告:此功能很危险   并且不鼓励使用它。线程   可以在其中的任何一点终止   代码路径。线程可以终止   修改数据。没有   线程清理后的机会   本身,解锁任何持有的互斥锁等   简而言之,只有在使用此功能时才使用   绝对必要。

更好的解决方案是在你的线程中创建一个自己的槽terminateAsSoonAsPossible(),它将变量shouldTerminate设置为true,你可以在你的线程中轮询并退出,如果它是真的。

答案 2 :(得分:1)

“鲍勃的程序员有编程问题。 Bob决定使用线程。 现在Bob有两个问题。“ - 从StackOverflow上的一个线程

我可以建议您查看processEvents(),这将帮助您的程序非常简单地保持对操作系统的响应,而无需线程或计时器吗? 我有类似的选择,发现这是一个不错的选择。它可能是也可能不是您项目的最佳选择。

processEvents reference