我从来没有在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
答案 0 :(得分:1)
从狭隘的角度来看,你可以使用看门狗模式来实现你的问题,看门狗模式定期检查是否已经触发了线程关闭时间。 但这种方式会带来许多错误并花费时间。回顾使用QThreadPool的可能性 - 忘记了自己的线程分配/销毁管理
池的另一个好处是改进了线程创建的长期操作。而不是等待新线程只重用现有的线程。
答案 1 :(得分:1)
尝试使用计时器:
myopThread *t = new myopThread;
QTimer::singleShot(120000, myopThread, SLOT(terminate()));
t->start();
void QThread :: terminate()[slot]
警告:此功能很危险 并且不鼓励使用它。线程 可以在其中的任何一点终止 代码路径。线程可以终止 修改数据。没有 线程清理后的机会 本身,解锁任何持有的互斥锁等 简而言之,只有在使用此功能时才使用 绝对必要。
更好的解决方案是在你的线程中创建一个自己的槽terminateAsSoonAsPossible()
,它将变量shouldTerminate
设置为true,你可以在你的线程中轮询并退出,如果它是真的。
答案 2 :(得分:1)
“鲍勃的程序员有编程问题。 Bob决定使用线程。 现在Bob有两个问题。“ - 从StackOverflow上的一个线程
我可以建议您查看processEvents(),这将帮助您的程序非常简单地保持对操作系统的响应,而无需线程或计时器吗? 我有类似的选择,发现这是一个不错的选择。它可能是也可能不是您项目的最佳选择。