Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止QThread以执行_Qt_Timeout_Qthread - Fatal编程技术网

停止QThread以执行

停止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

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

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子类化