0

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

QSocketNotifier: socket notifiers cannot be enabled from another thread

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

为新套接字创建线程的对象- 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 连接到插槽 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>它会导致一些关键部分问题或事件排队并且不会同时执行吗?

请就这两点提出建议。

4

1 回答 1

0

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

  • QTcpSocket 本身不是线程安全的
  • 只要您在连接槽时使用 Qt::QueuedConnection (或至少正确使用不同线程之间的隐式连接这样做),所有在连接槽内执行的代码都将在对象的线程循环中执行。换句话说,从不同线程发出的信号将被排队。
于 2013-11-22T22:30:44.197 回答