QT自由线程的终止
1. QT线程(QThread的子类)的退出:
(1)使用terminate()函数无法退出;线程可能会立即被终止也可能不会,这取决于操作系统的调度策略,使用terminate()之后再使用QThread::wait()确保万无一失。但我在程序中我发现使用VS2017编译的程序无法使用terminate()。
(2)当删除(delete)线程实例时,出现阻塞,程序无法进行。
解决方法:
(1)不再使用terminate退出,使用条件退出run函数
(2)在删除线程实例时,可能需要判定它是否退出了run函数;最简单的是使用wait(1000)这样的函数等待其退出后再删除。
2. QT线程中使用zmq时:
(1)可能会在zmq_recv函数阻塞时,无法退出线程
解决方法:
(1)采用定时的接收阻塞,保证有非阻塞状态来检查退出条件;
int recvTime = 1000; zmq_setsockopt(_socket, ZMQ_RCVTIMEO, &recvTime, sizeof(recvTime));
(2)在退出线程时最好将连接关闭。