Moh*_*ani 13 c++ qt signals-slots emit stdthread
我想从Qt中的C++线程(std :: thread)发出信号.
我该怎么做?
jpo*_*o38 12
你绝对可以发出从一个线程(一个信号QThread,std::thread甚至boost::thread).只有你必须小心你的connect函数的第五个参数(Qt::ConnectionType):
If Qt::DirectConnection:当发出信号时,立即(从当前线程)调用槽.If Qt::QueuedConnection:当控制返回到接收者线程的事件循环时调用插槽.插槽在接收器的线程中执行.
有关 更多选项,请参阅ConnectionType-enum.
问题不在于您从哪个线程发出信号,而是从调用插槽的哪个线程开始.例如,我认为QLabel::setText必须从QLabel所有者线程(很可能是主线程)执行.所以,如果你发出连接到信号QLabel的setText从一个线程,连接必须具有完成Qt::AutoConnection,Qt::QueuedConnection或Qt::BlockingQueuedConnection.
std::thread一般来说,您可能不应该不小心地从创建的线程中发出 Qt 信号。请参阅Jpo38 的回答:连接类型很重要,等等......
如果线程正在运行某些 Qt 事件循环,您可能可以。请参阅线程和 QObject
有一个(可能是特定于 Unix 的)解决方法,与 Qt 的 Unix 信号执行相同的操作:使用从主线程到主线程的管道std::thread。
但是,正如Joachim Pileborg所评论的,您应该创建自己的QThread。它是最简单的,也可能是最短的(就源代码而言),您只需复制并粘贴一些现有示例并根据您的需要进行调整。
请注意,据我所知,只有主线程应该执行 Qt GUI 操作。你不应该在主线程之外使用任何 QWidget(等等)!(顺便说一句,GTK 也有同样的限制,至少在 Linux 上:只有主线程才应该使用X Windows 系统协议)