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)在退出线程时最好将连接关闭。

原文地址:https://www.cnblogs.com/myboat/p/14094178.html