我正在将一些套接字从主线程移动到工作线程,并在新线程上处理,readyRead()
等。我很少看到以下危险警告:close()
write()
“QSocketNotifier:不能从另一个线程启用或禁用套接字通知”
通常在此警告之后执行会导致未定义的行为(崩溃/未捕获的异常/正常)。
已经检查了插座的所有信号/插槽,它们看起来是正确的。根据我的经验,如果有任何编码不规则,通常上述警告会很频繁或很快。
现在我怀疑moveToThread()
它是否按预期工作!因为从QEvent文档QEvent::ThreadChange
中,在此函数调用期间,a 作为当前线程上的最后一个事件引发。
对象被移动到另一个线程。这是在前一个线程中发送给该对象的最后一个事件。见1。1在线程亲和性改变之前,一个事件被发送到这个对象。您可以处理此事件以执行任何特殊处理。
QObject::moveToThread()
QEvent::ThreadChange
在我的代码中,我没有检查此事件。相反,我假设,一旦moveToThread()
完成,线程亲和力就会改变,并且对象上的新“信号/插槽”在新线程上得到保证。
问题:
- 将套接字移动到另一个线程是否安全?
- 将
moveToThread()
确保该对象上的信号在此函数之后也被移动到新线程? - 应该如何设计以确保 Socket 没有螺纹不规则性?
顺便说一句,在最新的 Qt 调试器中,它位于以下代码段:
// qsocketnotifier.cpp
if (Q_UNLIKELY(thread() != QThread::currentThread())) {
qWarning("QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread");
return;
}