【问题标题】:QSocketNotifier warning -- using socket inside a threadQSocketNotifier 警告——在线程中使用套接字
【发布时间】:2013-11-22 11:12:31
【问题描述】:

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

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> 它会导致一些关键部分问题或事件排队 &不会同时执行?

请就这两点提出建议。

【问题讨论】:

  • 谁能在这个线程上提出建议?

标签: qt qtcpsocket


【解决方案1】:

这似乎太复杂了。您无需创建线程即可使用套接字。 无论如何,如果您这样做,需要牢记以下两点:

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

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2017-05-30
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多