停止QThread以执行
我正在尝试在我的QT应用程序中实现超时。我使用QThread来执行该操作(需要超时的任务),并使用qefersedtimer来计算等待执行该操作所花费的时间。下面是代码片段停止QThread以执行,qt,timeout,qthread,Qt,Timeout,Qthread,我正在尝试在我的QT应用程序中实现超时。我使用QThread来执行该操作(需要超时的任务),并使用qefersedtimer来计算等待执行该操作所花费的时间。下面是代码片段 QElapsedTimer timeoutTimer; // Timer to count the elapsed time waiting for the operation to complete. long timeoutInterval=10000 MyThread mThread(); // QThread
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();
}
qepersedtimer timeoutTimer;//计时器,用于计算等待操作完成所用的时间。
long-timeoutInterval=10000
MyThread mThread();//QThread实现
timeoutTimer.start();
mThread.start();
while((timeoutTimer.appeased()
现在,若任务未完成且超时发生,我会在线程仍在运行时被销毁,应用程序就会崩溃。
我试图调用QThread的terminate()函数,但它在Windows上运行,但在Linux上我遇到了分段错误。尝试使用文档中提到的
void QThread::quit()
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.
尝试使用文档中提到的
void QThread::quit()
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.
您已经提到
quit()
对您的线程不起作用,所以我想您已经重新实现了QThread::run
方法,并且在实现中没有使用事件循环。正如文件所说:
在大多数情况下,子类化QThread是不必要的,因为QThread
提供功能齐全的线程管理功能。尽管如此,
如果您希望实现高级线程,可以将QThread子类化
管理层。这是通过将新成员函数添加到
子类,和/或通过重新实现run()。QThread的run()函数是
类似于应用程序的main()函数,它在
线程已启动,返回时线程将结束
注意:在Qt 4.4之前,使用QThread进行并行处理的唯一方法
处理是将其子类化并在内部实现处理代码
运行()。这种方法现在被认为是不良做法;QThread应该是
只管理线程,不管理进程数据
因此,不要子类化QThread
。您可以使用standart事件循环和信号槽系统来使用线程。如果可以完成任务,还可以使用更高级的界面,例如QRunnable
如果您确定要重新实现
QThread::run
,并消除事件循环的优点,那么应该注意手动停止线程。例如,您可以使用一些布尔标志bool need\u\u stop
,并在线程运行时定期检查其值。决定停止线程时,请将标志值设置为true,然后调用QThread::wait()
。当QThread::run
由于标志的值而完成时,线程将停止,并且wait()
将返回。但是请注意,您不能简单地从新线程和GUI线程同时使用一个标志。您需要一些同步机制,如QMutex
。所以,这件事太复杂了。如果您不想做一些真正低级的事情,就不要将QThread子类化。您提到了quit()
对您的线程不起作用,所以我想您已经重新实现了QThread::run
方法,并且在实现中没有使用事件循环。正如文件所说:
在大多数情况下,子类化QThread是不必要的,因为QThread
提供功能齐全的线程管理功能。尽管如此,
如果您希望实现高级线程,可以将QThread子类化
管理层。这是通过将新成员函数添加到
子类,和/或通过重新实现run()。QThread的run()函数是
类似于应用程序的main()函数,它在
线程已启动,返回时线程将结束
注意:在Qt 4.4之前,使用QThread进行并行处理的唯一方法
处理是将其子类化并在内部实现处理代码
运行()。这种方法现在被认为是不良做法;QThread应该是
只管理线程,不管理进程数据
因此,不要子类化QThread
。您可以使用standart事件循环和信号槽系统来使用线程。如果可以完成任务,还可以使用更高级的界面,例如QRunnable
如果您确定要重新实现QThread::run
,并消除事件循环的优点,那么应该注意手动停止线程。例如,您可以使用一些布尔标志bool need\u\u stop
,并在线程运行时定期检查其值。决定停止线程时,请将标志值设置为true,然后调用QThread::wait()
。当QThread::run
由于标志的值而完成时,线程将停止,并且wait()
将返回。但是请注意,您不能简单地从新线程和GUI线程同时使用一个标志。您需要一些同步机制,如QMutex
。所以,这件事太复杂了。如果不想做一些真正低级的事情,就不要将QThread子类化