根据以下帖子,只有当前执行的 slot 完成后,发出的信号才会被处理。
等待 Qt SLOT 执行完毕 我有一个基于 SSL 套接字的客户端-服务器通信应用程序,它是单线程的。
客户端和服务器相互发送一些自定义消息。每当任何一方发送或接收消息时,它们都会发送
大多数情况下,我发现当
当接收到太多数据时,会创建太多
通常,当客户端尝试作为
- 对于单个线程,默认情况下,
-
等待 Qt SLOT 执行完毕 我有一个基于 SSL 套接字的客户端-服务器通信应用程序,它是单线程的。
connect(socket, &QSslSocket::readyRead, [&]() { myObject.Read(); });
客户端和服务器相互发送一些自定义消息。每当任何一方发送或接收消息时,它们都会发送
ACK
字节 (00)。大多数情况下,我发现当
Read()
在执行中间时,下一个 readyRead()
被调用了!我在 myObject->Read()
的开始和结束处放置了调试语句。它们证实了开始的调试被再次调用。断点也有同样的现象。当接收到太多数据时,会创建太多
Read()
的递归堆栈帧。 它要么使应用程序GUI变慢,要么崩溃。通常,当客户端尝试作为
myObject->Read()
的一部分发送 ACK 时,就会发生这种递归。此时不经意间发出并处理了 readyRead()
。然而,前一个信号的槽仍在处理中。
问题:
- Qt框架是否可能在槽仍处于中途(单线程)时提供信号?
- 如何解决此套接字特定的情况?
- 对于单个线程,默认情况下,
Qt::ConnectionType
是 DirectConnection
。我已经尝试使用 QueuedConnection
,但结果是相同的。-
myObject.Read()
是相当复杂的,并且有许多其他函数调用。如果这是问题的原因,请告诉我应该查找什么。写出它的实际代码是不切实际的。
Socket::readyRead()
在任意时间被调用。这没关系,但是不知怎么的,它会立即处理,即使之前的SLOT还没有完成。有没有办法检查事件循环是否在中间空闲了(虽然我认为这是不可能的)。 - iammilindQtConcurrent::run()
功能来执行这些单个的sqlite操作(即INSERT,UPDATE
)?它会每次创建一个线程(耗时),还是保留一个线程池以供将来使用以获得更好的性能?请建议。 - iammilind