QT QTcpSocketが発生したデータの問題を読み書きするために複数のスレッドを使用して

マルチスレッディングはQTcpSocket使用
新しい新しいザQTcpSocket run()メソッドを、次に()信号接続(m_pTcpSocket、SIGNAL(readyRead(readyReadをモニター ))、このスロット(sloat_RecvData()))。

プログラムは警告を報告します。問題は、サーバーにいくつかのコマンドを送信する必要がある場合(m_pTcpSocket->書き込み(BYTEARRAY)を使用する)である別のスレッドから有効にすることができノーティファイアをソケットではありません:QSocketNotifierを
私は、TCPサーバーに接続しにQThreadのサブクラスWorkerThreadにQTcpSocketを使用してサーバーにデータを送信する必要があります。
WorkerThread :: RUNボイド()
{
  m_pTcpSocketザ・QTcpSocket新しい新=();
  ながら、(1){
    ...;
    m_pTcpSocket-> connectToHost(QHostAddress :: LocalHostという、8001);  //接続サーバ
    m_pTcpSocket-> waitForConnected(3000);              //待ちます接続に成功
    int型nByteWrite m_pTcpSocket- => 書き込み(strMessage.toUtf8());                 //がサーバーにデータを送信します 
  }
}
サーバーに接続できますが、書き込み送信データを呼び出したとき、サーバは、失敗した送信ここでショーを受信していないデータを発音することができないクライアントを-
解決するために
その後、後のwrite()メソッドを使用した後、再利用フラッシュ()この方法は、メッセージを送信することができます。
QTの公式文書は後に、バッファされたデータを一度に送信することができますフラッシュ()メソッドを呼び出すと、述べています。
推定QTcpSocketライト()メソッドは、バッファリングしたれます。
WorkerThread :: RUNボイドは()
{
  m_pTcpSocketザ・QTcpSocket新しい新=();
  ながら、(1){
    ...;
    m_pTcpSocket-> connectToHost(QHostAddress :: LocalHostという、8001);
    m_pTcpSocket-> waitForConnected(3000);
    int型nByteWrite m_pTcpSocket- =>書きます(strMessage.toUtf8()); m_pTcpSocket->フラッシュ();   } }
    

上面的客户端TcpSocket成功地将数据write发送给了服务端,但是又发现客户端readyRead信号一直不进它的槽函数sloat_RecvData()。真是一波刚平一波又起啊,现在客户端又收不到数据了~
解决
检查connect(tcpSocket, SIGNAL(readyRead()),this,SLOT(update_message()));返回值为true,说明信号槽连接起来了~
服务端检查write函数的返回值,为非零,说明也发出去了~
线程while(1)循环很快,在该循环中,循环过快,导致connect来不及处理数据,所以使用waitForReadyRead()将循环进行阻塞,当有数据读入时取消阻塞,进入下一轮循环。
void WorkerThread::run()
{
  m_pTcpSocket = new QTcpSocket();
  while (1) {
    …;
    m_pTcpSocket->connectToHost(QHostAddress::LocalHost, 8001);
    m_pTcpSocket->waitForConnected(3000);
    int nByteWrite = m_pTcpSocket->write(strMessage.toUtf8());
    m_pTcpSocket->flush();
    m_pSocket->waitForReadyRead();
  }
}

在多线程中是socket,确实挺棘手的!记录一下,仅供参考~

おすすめ

転載: www.cnblogs.com/MakeView660/p/10938075.html