转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39395025
Qt的signals/slots是可以用在线程间的。由于事件循环(event loop)是在主线程完成的,所以在非主线程发送一个信号时,对应的槽函数将会由主线程执行。
熟悉多线程的读者应该都感受到这里会有一个微妙的问题。如果signals/slots的函数参数是一个自己定义的类型。比如自己定义了一个Student类,信号函数为sendStudent(const Student &stu); 对应的槽函数为:getStudent(const Student &stu); 如果在非主线程使用emit发射信号的时候,Student参数是一个临时变量的话(即可能马上被析构掉),那么主线程在执行这个槽函数的时候这个临时变量可能被析构了。这就相当于使用了野指针。
Qt的作者肯定也想到了这一点。
我们回过头来深入了解connect函数,因为是它把信号和槽连起来的。在connect函数中,我们一般都只使用4个参数。实际上它是有5个参数的,只是使用了默认参数而已。第5个参数是一个枚举类型Qt::ConnectionType,有下面5种:
- Qt::AutoConnection: 如果发射信号的线程和执行槽函数的线程是在同一个线程,此时等同于Qt::DirectConn