0

次のような状況があります。

  • ループ内のメインで2 つSocketのオブジェクトが作成されます (元の問題には 1000 個のオブジェクトがあります)。作成時にメソッドが呼び出されます。forstart()
  • start()QTcpSocketホストに接続しようとする を作成します。
  • Socketconnected()QTcpSocket からのシグナルをキャッチし、デバッグ出力を出力するスロットがあります。

時系列で最初にすべてのSocketオブジェクトが作成され、その後ソケットが開始されます。デバッグ オプションの出力例を次に示します。

1. Created Socket object 1
2. Invoked Socket object 1 start()
3. Created Socket object 2
4. Invoked Socket object 2 start()
5. Socket object 1 TcpSocket Connected
6. Socket object 2 TcpSocket Connected

コード:

//main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    for (int i=0; i<10; i++)
    {
        Socket *socket = new Socket();
        qDebug() << "Socket object created";
        socket->Start();
    }
    return a.exec();
}

//socket.cpp
Socket::Socket(QObject *parent)
    : QObject(parent)
{}

void Socket::Start()
{
    qDebug()<<"Start method invoked";
    socket = new QTcpSocket(this);

    connect(socket,SIGNAL(connected()), this, SLOT(on_connect()), Qt::DirectConnection);
    socket->connectToHost("192.168.5.5",12345);
}

void Socket::on_connect()
{
    QTcpSocket* socket = qobject_cast<QTcpSocket *>(QObject::sender());
    qDebug() << socket->socketDescriptor() <<  " Connected.";
}

ドキュメントに次のように記載されているため、これは私が期待した動作ではありません。

シグナルが発行されると、それに接続されているスロットは、通常の関数呼び出しと同じように、通常すぐに実行されます。これが発生すると、シグナルとスロットのメカニズムは、GUI イベント ループから完全に独立します。

質問:

シグナルが送信されたときにスロットが「すぐに」(メインのループが終了した後だけでなく) 実行されるようにするにはどうすればよいですか?


私が現在見ている唯一の解決策(新しいスレッドを導入せずに)

この場合、シグナルとスロットの使用をやめ、すべてをstartメソッドに実装します。このようなもの:

Socket::start(){
...
if(!tcpsocket->waitForConnected(200)) qDebug() << "Socket object X TcpSocket Connected"
...
}
4

3 に答える 3

5

QTcpSocketの信号が発信されると、スロットは実際にすぐにトリガーconnected()されます。

ただし、connected()そのソケットをどこかに接続しようとした瞬間には発行されません。

ドキュメントには次のように書かれています。

このシグナルは、connectToHost() が呼び出され、接続が正常に確立された後に発行されます。

接続の確立には、イベント ループが必要です。

于 2013-10-25T08:44:38.670 に答える
0

新しいスレッドを導入せずにそれを行うことはできないと思います.唯一の解決策はあなたの解決策のようです.

または、空のままにする代わりに DirectConnection を使用することが解決策になる場合があります (これは AutomaticConnection であり、これは QueuedConnection です)。しかし、そのスロットを実行するために待つ必要があるため、うまくいくとは思いません。よくわかりませんが、試してみてください。

于 2013-10-25T08:41:27.903 に答える