Qt中主线程如何不优雅地结束掉一个被卡死的子线程

前提

这里所说的子线程其实是一个类,使用如下代码让其实例化对象运行在单独的线程中。例如是一个class A,如下代码中m_thread是在.h文件里声明,其余代码是在A的构造函数中。

QThread m_thread;
this->moveToThread(&m_thread);
m_thread.start();

我们在主线程中构建了一个A的对象,在class A中执行了某个操作,如果参数不对,其中某个函数会一直阻塞,不像现在网上大部分说的while循环加一标志位来结束阻塞那么简单。我也试过使用terminate()但是好像没用,软件退出后,那个线程仍然没用结束掉。

解决办法

其实也比较简单,在主线程中调用delete A(这里A是class A new出来的一个对象),然后在calss A的析构函数里执行如下代码:

    m_thread.requestInterruption();
    m_thread.quit();
    //m_thread.wait();

requestInterruption()按照字面意思是请求中断,这样就可以从阻塞的地方暂时跑出来,然后执行quit来结束这个线程。注意,不要在后面使用wait(),这样的话也会再次被阻塞。
这样的话,在程序退出时,虽然会提示程序异常结束,但是那个阻塞的子线程的确也结束掉了。所以,我将该方法命名为不优雅退出阻塞线程法。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值