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 つのスレッドが作成され、両方のスレッドが同時にシグナルを発すると仮定すると、スロットの実行中に競合が発生しますか?
2>クリティカル セクションの問題が発生したり、イベントがキューに入れられて同時に実行されなかったりしますか?

この2点について提案してください。

4

1 に答える 1