【发布时间】:2017-05-02 03:06:43
【问题描述】:
环境简介: 我有一个设备运行一个用 qt 编写的应用程序。它有一个处理数据库操作(SQlite)的主线程和一个用于网络操作(通过3G)的单独线程。 主线程事件循环由 QCoreApplication::exec 运行,处理网络操作的另一个线程由 QThread::exec 运行。顺便说一句,套接字线程关联在启动后会更改(例如 moveToThread(socketThreadPtr))
问题简介: 主线程忙于一个循环,以便从数据库中选择大约 10k 条记录,该循环大约需要 +30 秒。在网络线程中有一个 15 秒的计时器,它必须在每次到期时发送一条保持活动消息。问题是 timeout() 信号的槽只有在循环结束后才会执行。
到目前为止建立的解决方案(但不令人满意): 如果我在选择记录的循环中调用 QCoreApplication::processEvents,问题就解决了,但我想知道是否存在解决方案而不是这种解决方法。
备注: 定时器、信号和槽,提供发送保持活动消息的命令当前在主线程中处理(但读/写发生在网络线程中)。另外,我在网络线程上移动了计时器,但得到的结果与在主线程上的结果相同。
【问题讨论】:
-
由于定时器是网络相关的,它应该在网络线程上。确保连接到它的插槽也在网络线程上的对象中。
-
计时器可能仍然存在于主线程中。第一:直接在线程上创建socket或者设置socketdescriptor并使用QueuedConnection打开socket。不要在构造函数中创建计时器并在对象上调用 movetothread,而是使用 invokeMethod 或排队的信号/插槽连接调用初始化函数。在此函数中,使用 new 创建计时器。否则计时器实际上会留在主线程中
-
大家好!感谢您的快速回复。凯文,我把计时器完全移到了网络线程中,它在网络线程上有相应的插槽。顺便说一句,计时器是在堆上创建的。
标签: qt signals qthread qtimer qeventloop