1

基本的なマルチスレッド TCP サーバーを作成しました。接続されているすべてのクライアントにデータを送信したいと考えています。サーバークラスのシグナルwriting(QByteArray)をソケットスレッドのスロットwriteToSocket(QByteArray)に接続しましたが、上記のシグナルを発行してそのソケットに書き込もうとすると、セグメンテーション違反が発生します。ソケット オブジェクト (スレッドのプロパティ) のメソッドにアクセスできないのと同じです。

私の簡略化されたコード:

void MyServer::incomingConnection(int handle)
{
ConnectionThread *thread = new ConnectionThread(handle, this);
connect(this, SIGNAL(writing(QByteArray)), thread, SLOT(writeToSocket(QByteArray)));
// Some more code necessary for thread to work
}

void RoleNetServer::WriteToAll(QByteArray data) 
{
    emit writing("test");
}

次に、スレッドのソース ファイルで:

void ConnectionThread::writeToSocket(QByteArray data) // a slot
{
    this->socket->write(data);
}
4

1 に答える 1

0

ただのアイデア。私は多分間違っています。

新規/削除はC++ではスレッドセーフではありません。これがC++0xにも当てはまるかどうかはわかりません。pthreadでこの問題が発生しました。

newで割り当てられたメモリを使用すると、構文が正しいように見えても、セグメンテーション違反が発生する可能性があります。可能であれば、thread/threaded関数に割り当ててみてください。

これがお役に立てば幸いです。

于 2012-04-17T06:51:51.400 に答える