【发布时间】:2013-10-25 08:24:36
【问题描述】:
我有以下情况。
- 2
Socket对象在for循环中的 main 中创建(原始问题有 1000 个对象)。创建时会调用start()方法。 -
start()创建一个QTcpSocket尝试连接到某个主机。 -
Socket具有从 QTcpSocket 捕获connected()信号并打印一些调试输出的插槽
按时间顺序首先创建所有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.";
}
这不是我所期望的行为,因为documentation 声明:
当一个信号发出时,连接到它的槽通常是 立即执行,就像正常的函数调用一样。当这 发生时,信号和槽机制完全独立于任何 GUI 事件循环。
问题:
当信号发出时,如何确保插槽“立即”执行(不仅在主循环完成后)?
我目前看到的唯一可用的解决方案(不引入新线程):
在这种情况下放弃使用信号和插槽,并在start 方法中实现所有内容。像这样的:
Socket::start(){
...
if(!tcpsocket->waitForConnected(200)) qDebug() << "Socket object X TcpSocket Connected"
...
}
【问题讨论】:
-
你能多写一点代码吗?
-
如果你给出一个代码示例而不是描述它会更有用。我可以用多种方式解释您的描述,但会确切地知道源代码在做什么。
-
@Merlin069 已更新代码
-
slots 在信号发出后立即执行(当使用 directConnection 或来自一个线程的对象通过 AutomaticConnection(默认值)连接时)。现在您可能不高兴,因为您期望
Socket object 1 TcpSocket Connected应该在位置3而不是5。这里的问题是 SIGNAL 在正确建立连接后发出,并且需要事件循环来接收一些系统通知。
标签: qt signals-slots event-loop qt-signals