QSocketNotifier警告 - 在线程内使用套接字

时间:2013-11-22 11:12:31

标签: qt qtcpsocket

我可以删除此警告,请在以下几点提出建议。

QSocketNotifier: socket notifiers cannot be enabled from another thread

每当新请求到达QTcpServer时,我都会创建新对象 - xxx。然后,该对象为此套接字创建线程。发送接收数据 yyy对象的dowork_socket()函数。在dowork_socket()函数里面我发出信号signalTcpSocketWriteData()来从socket发送数据。

为新套接字创建线程的对象 - xxx(我没有粘贴完整代码):----

yyy * ptr;
QTcpSocket *m_pTcpSocket;

public slots:
    void writeDataSlot( QByteArray data )
    {
        m_pTcpSocket->write( data );
        m_pTcpSocket->flush();
    }

移动线程的对象 - yyy(我没有粘贴完整代码):----

xxx *TcpSocketWrapper_ptr;

signals:
    void  signalTcpSocketWriteData( QByteArray);

public slots:
    void dowork_socket();

在上面的对象yyy构造函数中我将信号signalTcpSocketWriteData连接到slot writeDataSlot:---

connect(this, SIGNAL(signalTcpSocketWriteData( QByteArray)), TcpSocketWrapper_ptr, SLOT(writeDataSlot( QByteArray )), Qt::QueuedConnection );

对象yyy的dowork函数: -

void TcpSocketThreadObject::dowork_socket()
{
    QByteArray block;


    block.append(" \n hi again .. !!!");

    emit signalTcpSocketWriteData(block);
}

我能够通过上述方法完全发送数据成功&以上警告已被删除。

1>现在我的问题是假设创建了两个线程&两个线程同时发出信号然后运行插槽会有冲突吗? 2>是否会导致某些关键部分问题或事件排队等待不会同时执行?

请就这两点提出建议。

1 个答案:

答案 0 :(得分:0)

这似乎太复杂了。您不需要创建线程来使用套接字。 无论如何,如果你这样做,这里有两点需要牢记:

  • QTcpSocket本身不是线程安全的
  • 只要在连接插槽时使用Qt :: QueuedConnection(或者至少正确使用不同线程之间的隐式连接),所有在连接插槽内执行的代码都将在对象的线程循环中执行。换句话说,从不同线程发出的信号将排队。