前提
这里所说的子线程其实是一个类,使用如下代码让其实例化对象运行在单独的线程中。例如是一个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(),这样的话也会再次被阻塞。
这样的话,在程序退出时,虽然会提示程序异常结束,但是那个阻塞的子线程的确也结束掉了。所以,我将该方法命名为不优雅退出阻塞线程法。