3

このエラーは、このスニペットで発生しました:

void TCPConnectThread::run()
{
    m_socket = new QTcpSocket();
    m_socket->setSocketDescriptor(m_fd);

    m_socket->waitForReadyRead(10000);

    QString data = m_socket->readAll();

    m_socket->waitForDisconnected();
}

少し深い:

if (::WSAIoctl(socketDescriptor, FIONREAD, &dummy, sizeof(dummy), &nbytes,  
sizeof(nbytes), &sizeWritten, 0,0) == SOCKET_ERROR) <-Exception here
{
    WS_ERROR_DEBUG(WSAGetLastError());
    return -1;
}

より深い:

if (::getsockopt(d->socketDescriptor, SOL_SOCKET, 
SO_ERROR, (char *) &value, &valueSize) == 0) <-Here

invalid handlerunメソッドの終了時に例外が発生しました。

m_socket を取得する方法は次のとおりです。

m_socket = new QTcpSocket();
m_socket->setSocketDescriptor(m_fd);//m_fd is the socket descriptor of another socket
                                    //from another thread

m_fd収集 元のスレッドは次のとおりです。

void TCPListenerThread::onNewConnection()
{
    QTcpSocket *clientSocket = m_tcpServer->nextPendingConnection();
    int sockfd = clientSocket->socketDescriptor();
    m_connectThread = new TCPConnectThread(sockfd);
    m_threadPool->start(m_connectThread);
}

例外:

Most possible exception at 0x76edf9ea in manager_host.exe:   
0xC0000008: An invalid handle was specified  

この無効なハンドルをどこでどのように見つけることができますか?

4

1 に答える 1

1

QTcpSocketオブジェクトのソケット記述子は、別のオブジェクトによって既に使用されている場合は使用できませんQTcpSocket。また、一度割り当てられた割り当てを解除する方法もありません。QTcpSocket

initial を明示的に使用しなくても、QTcpSocketそれが作成されたスレッドにイベント ループがある場合 (これはおそらくここに当てはまります)、Qt はそのスレッドでそれを監視します。

別の方法として、次のことができます。

  • QTcpServerクラスを派生させてメソッドを再定義し、 ORを使用する代わりに、にincomingConnection(int socketDescriptor)割り当てられる前にその記述子を取得します。QTcpSocketnextPendingConnection
  • スレッド コンストラクターへのパラメーターとして、ソケット記述子の代わりにQTcpSocket受け取ったものを直接渡し、それを他のスレッドに移動します (その注を参照)。nextPendingConnection

    TCPConnectThread(QTcpSocket *socket)
        : m_socket(socket) 
    {
        m_socket−&gt;setParent(0); // necessary to move the object to another thread
        m_socket->moveToThread(this);
        ...
    }
    

    移動は最初のスレッドから行う必要があるため、ランナブルが使用するQRunnable未来に簡単にアクセスできない可能性があるため、最初の選択肢は を使用する方が簡単かもしれません。QThread

于 2013-06-21T13:08:22.820 に答える