2011-02-02 11 views
3

私のスレッド化されたTCPサーバーに問題があります。
ソケットを介してデータを受け取ることができる新しいソケットが作成されました(私はreadyRead()シグナルを使用してreadLine()を使用して読み取りましたが、正常に動作しています。このソケットを別のスレッドから作成したので、これを処理するpublicスロットwriteData()を作成しました。私はwriteData()スロットをQueuedConnection(AutoConnectionも試しました)に接続しましたが、m_socket-> writeエラーメッセージ:自分のスレッドでTcpSocketにデータを書き込む

にQObject:別のスレッドである親のために子を作成することはできません (親がQNativeSocketEngine(0x12f0f70)、親のスレッドはQThread ServerThread(0xfbbae8)、 現在のスレッドがされているである(0xfa7c48)

ここだけで、最小限の例:
は、私は誰もがそれを想像することができると思うので、書き込みデータ()スロットに私の他のスレッドから接続省略;)事前に

class Server : public QTcpServer { 
    Server(); 
protected: 
    void incomingConnection(int socketDesc); 
} 

Server::Server() : QTcpServer() { 
    this->listen(QHostAddress::Any, PORT); 
} 

void Server::incomingConnection(int socketDescriptor) { 
    ServerThread *t = new ServerThread(socketDescriptor); 
    t->start(); 
} 

class ServerThread : public QThread { 
    ServerThread(int socketDescriptor); 
protected: 
    void run(); 
public slots: 
    void writeData(QString data); 
private: 
    int m_socketDescriptor; 
    QTcpSocket *m_socket; 
} 

ServerThread::ServerThread(int socketDescriptor) : QThread(), m_socketDescriptor(socketDescriptor) {} 

void ServerThread::run() { 
    m_socket = new QTcpSocket(); 
    m_socket->setSocketDescriptor(m_socketDescriptor); 
    exec(); 
} 

void ServerThread::writeData(QString data) { 
    m_socket->write(data.toAscii()); 
} 

感謝。

+0

'writeData'を直接呼び出す代わりに' whitSignalIsConnectedToWriteData(str) 'を使用していると確信していますか? –

答えて

5

エラー・メッセージの意味:

あなたの信号スロット通信が作成され、メインスレッドに属したServerThreadインスタンスで発生します。しかし、のインスタンスServerThreadメンバーm_socketが作成され、他のスレッドに属しています。

私は単純なQThreadを作成してオブジェクトをその中に移動することをお勧めします。

void Server::incomingConnection(int socketDescriptor) { 
    QThread *t = new QThread(); 
    ClientConnection *client = new ClientConnection(socketDescriptor); 
    client->moveToThread(t); 

    // go 
    t->start(); 
} 

class ClientConnection : public QObject { 
Q_OBJECT 
public: 
    ClientConnection(int socketDescriptor, QObject *parent = 0); 
public slots: 
    void writeData(QString data); 
private: 
    int m_socketDescriptor; 
    QTcpSocket *m_socket; 
} 
+0

ええ、これは問題です..私のServerThreadインスタンスのスレッドアフィニティが、シグナルを送出したインスタンスと同じであったため、QtはinvokeMethodを実行しませんでした.. – Tobias

+0

クライアントはClient :: start時に自分自身のQThreadに移動しますが、同じエラー – FxIII

関連する問題