次のような状況があります。
- ループ内のメインで2 つ
Socket
のオブジェクトが作成されます (元の問題には 1000 個のオブジェクトがあります)。作成時にメソッドが呼び出されます。for
start()
start()
QTcpSocket
ホストに接続しようとする を作成します。Socket
connected()
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"
...
}