1

ここではほとんど問題はありません。信号とスロットに問題があります。擬似コードで説明しようと思います。だから、ここに行きます。

新しいクライアントが接続したときに新しいオブジェクトを作成するメインスレッド(mainwindow.cpp)があります。

mainwindow.h:

signals:
   void changeText();
...

mainwindow.cpp:

connect(tcpserver, SIGNAL(changeText()), this, SIGNAL(changeText()));

...

MyClass *m = new MyClass(this);
connect(this, SIGNAL(changeText()), m, SLOT(changeText()));

また、tcpserverクラスもあります。これは、クライアントが両方のシグナルを接続および接続するときに新しいQThreadを作成します。

tcpserver.h:

signals:
    void changeText();
protected:
    void incomingConnection(int handle);

tcpserver.cpp:

void incomingConnection(int handle)
{
    QTcpSocket *s = new QTcpSocket(this);
    s->setSocketDescriptor(handle);
    mythread *thread = new mythread(s, this);
    connect(thread, SIGNAL(changeText()), this, SIGNAL(changeText()));
}

問題は次のとおりです。メインスレッド、QTcpServerから継承するtcpserverクラス、およびQThreadクラスから継承するmythreadクラスの3つのオブジェクトがあります。

「tcpserver」から新しい「mythread」-sを作成してシグナルを接続すると、新しいスレッドからのすべてのシグナルが「tcpserver」-sシグナルに接続されるため、たとえば、10個のクライアントが何かを実行すると、すべてのシグナルが「tcpserver」に送信されます。 「これは私にとって問題になります。QTread->TcpServer->MainWindowを介してMyClassに接続する必要がある信号を理解したい。

私の英語で申し訳ありませんが、私が何を意味するのか理解できない場合は、よりよく説明しようとします。

ありがとうございました。

4

1 に答える 1

0

いくつかの提案:

  • 「incomingConnection(int)」では、ヒープ(tcpsocketおよびmythread)で作成されたオブジェクトのメモリリークは疑わしいです。tcpserverでQList(または他のコンテナ)を使用して、「incomingConnection(int)」で作成されたソケットを保持します。
  • SLOT(changeText)の名前の前にクラスを付けて、意図した送信者/受信者がどのオブジェクトであるかを明確にします
  • 私はあなたが2つの信号を接続できないとは思わない

    connect(thread、SIGNAL(changeText())、this、SIGNAL(changeText()));

于 2013-03-11T12:41:58.207 に答える