Qt中如何设置按钮点击终止线程

Qt中如何设置按钮点击终止线程,第1张

QT线程有3个函数可以关闭线程,态没尘分别是:

void quit ()

相当于exit(0)。

void exit ( int returnCode = 0 )

调用exit后,thread将退出event loop,并从exec返回,exec的返回值就是returnCode。

通常returnCode=0表示成功,其他值表示失败。

void terminate ()

结束线程,线察歼程是否立即终止取决于 *** 作系统。

线程被终止时,所有等待该线程Finished的线程都将被唤醒。

terminate是否调用取决于setTerminationEnabled ( bool enabled = true )开关。

其中quit与terminate是槽,可以直接用信号连接关闭线程,不过一般不建议使用terminate,还有想关闭线程,最好像下面例子帆禅;

直接调用stop接口就行了,线程就会关闭

class Thread : public QThread

{

Q_OBJECT

public:

Thread()

void setMessage(const QString &message)

void stop()

protected:

void run()

private:

QString messageStr

volatile bool stopped

}

Thread::Thread()

{

stopped = false

}

void Thread::run()

{

while (!stopped)

std::cerr <<qPrintable(messageStr)

stopped = false

std::cerr <<std::endl

}

void Thread::stop()

{

stopped = true

}

主界面有两个按钮,点击“开始”按钮,触发一个信号,然后子线程打印一条信息,点击“结束”按钮,关闭线程

线程相关类定义如下

线程类变量定义如下

线程启动、信号槽及实现如下。在构造函数中通过thread.start()启动线程。

运行程序,并查看程序输出。点击一下“开始”按钮,会触发线程打印一条日志,再点击一下“开始”按钮,线程再次打印一条日志。点击“结束”按钮,打印线程乱搜结束。这时再点击“开始”按钮,线程将不再打印日志

修改线程打印函数为一个for循环,并在每次循环后sleep(5)秒

运行程序,然后点击“开始”按钮,线程开始打印日志。打印一两条后点击“结束”按森握钮,程序并没有停止打印日此陪庆志,而是等到for循环结束后,才打印线程结束的日志。这说明线程并没有结束

修改线程结束函数如下,使用terminal函数。再次执行相同的步骤。

线程可以正常退出,但是程序关闭时崩溃。

修改线程打印函数,增加flag标识,在线程退出时,修改该flag标识,达到for循环退出的效果。这样线程可以正常退出,而且程序关闭时也不会崩溃

bunfly.resolve() 返回的函数指针fp不一定有效,闭行检查一下是否为0

另外,name_line和menu_line应该是ui的成员仿颂,前面应该加ui->才对,你编译时没有错误吗,有点轿大哗疑惑


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8270206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存