首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止执行QThread

停止执行QThread
EN

Stack Overflow用户
提问于 2013-06-05 05:20:19
回答 2查看 3.5K关注 0票数 0

我正在尝试在QT应用程序中实现超时。我使用QThread来执行操作(需要超时的任务),并使用QElapsedTimer来计算等待执行操作的时间。下面是代码片段

代码语言:javascript
复制
QElapsedTimer timeoutTimer;   // Timer to count the elapsed time waiting for the operation to complete.
long timeoutInterval=10000
MyThread mThread();   // QThread implementation
timeoutTimer.start(); 
mThread.start();   

while((timeoutTimer.elapsed() < timeoutInterval) &&  mThread.isRunning()){
    sleep(5);
}


if(mThread.isRunning()){
  mThread.terminate();
}

现在,如果任务没有完成并且超时发生,我就会在线程仍在运行时破坏和应用程序会崩溃。我试图调用QThread的terminate()函数,但是它在Windows上工作,但是在Linux上,我遇到了分段错误。

EN

回答 2

Stack Overflow用户

发布于 2013-06-05 09:18:36

您已经提到quit()不适合您的线程,所以我认为您已经重新实现了QThread::run方法,并且在您的实现中没有使用事件循环。如文件所述:

子类QThread在大多数情况下都是不必要的,因为QThread提供了功能齐全的线程管理功能。尽管如此,如果您希望实现高级线程管理,则可以对QThread进行子类。这是通过向子类添加新成员函数和/或重新实现run()来实现的。QThread的run()函数类似于应用程序的main()函数-它在线程启动时执行,线程返回时结束。 注意:在Qt4.4之前,使用QThread进行并行处理的唯一方法是对其进行子类化,并在run()中实现处理代码。这种方法现在被认为是坏实践;QThread只应该管理线程,而不应该管理进程数据。

所以,不要使用子类QThread。您可以使用standart事件循环和信号插槽系统来使用您的线程。如果可以完成任务,还可以使用更高级别的接口,如QRunnable

如果您确信要重新实现QThread::run并消除事件循环的优点,则应该手动停止线程。例如,您可以使用一些布尔标志bool need_to_stop,并在线程运行时定期检查其值。当您决定停止线程时,将标志的值设置为true,然后调用QThread::wait()。当QThread::run由于该标志的值而完成时,您的线程将被停止,wait()将返回。但是,请注意,不能简单地同时使用新线程和GUI线程的一个标志。您需要一些同步机制,比如QMutex。所以这件事太复杂了。如果您不想做一些非常低级的事情,就不要将QThread子类。

票数 3
EN

Stack Overflow用户

发布于 2013-06-05 06:07:46

如文档中提到的那样,尝试使用void QThread::quit ()

代码语言:javascript
复制
Tells the thread's event loop to exit with return code 0 (success). Equivalent to calling QThread::exit(0).
This function does nothing if the thread does not have an event loop.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16932089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档