この警告を削除することができます。以下の点について提案してください。
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点について提案してください。