singleQt::QueuedConnection如何在单线程应用程序中工作
singleHow does Qt::QueuedConnection work in a single thread application?
我正在做:
connect(tcpSocket,SIGNAL(readyRead()), this, SLOT(onTCPDataArrived()), Qt::QueuedConnection);
但是插槽被调用的次数比它应该调用的次数要少得多。
它似乎错过了很多信号,可能是因为插槽需要很长时间(确实如此)。
我在tcp写入之间的传输端增加了2ms的延迟,这变得更好了:插槽被调用得更多。
问题:如果信号和插槽在同一个线程中,那么当插槽已经运行时,接收器是否仍在排队输入信号?
使用TCP/IP,对于如何在接收端将数据分割成数据包,有从未任何保证。因此,您可以"一次发送10个字节",并且接收端可以接收10个通知(每个字节一个)到0个通知之间的任何通知。为什么为零?因为您可能很快会再发送10个字节,并且会有一个通知用于所有20个字节。这与Qt完全无关。
因此,当readyRead()
触发时,您必须读取所有可供读取的数据。您将不会再次收到有关此数据的通知。
Qt::QueuedConnection文档规定
当控件返回到接收器的线程。插槽在接收器的线程中执行。
它的行为与触发信号的线程无关(并非所有连接类型都是这样)。
您所经历的是一个生产者tcpSocket
,它的生产速度快于消费者this
。正如你所说,onTCPDataArrived
需要很多时间。
您应该修改onTCPDataArrived
,以便:
- 要么它消耗大量。例如,如果生产者在写入每个字符后发出通知,消费者可以一次读取所有可用的字符
- 要么它会丢弃一些数据
相关文章:
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- OpenGL应用程序在不同的计算机上的工作方式不同
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- Visual Studio 中的套接字 c++ 应用程序无法通过两台计算机之间的以太网连接工作
- 如何将子窗口(MFC 应用程序)的工作区保存到图像
- 为什么我需要运行一个应用程序作为Papi库工作的根源
- 从 WebAPI 项目运行静态类时出现 StackOverflow 异常 - 从控制台应用程序运行时工作正常
- 当我跳到应用程序时,中断无法工作(STM32)
- 如何使用工作线程正确退出Qt应用程序
- 运行在DLL中的工作线程在应用程序关闭时被终止,然后才能正常关闭它们
- 套接字应用程序无法正常工作
- C++使用Qt库的应用程序在屏幕保护程序启动时停止工作
- 在我的Win32应用程序中使TAB键起工作
- 什么可能导致应用程序在工作几个小时后锁定获取 SIGABRT 失败
- 如何使用特定的工作目录运行/调试Netbeans平台应用程序
- 绘制移动图标,它一直是最顶端的鼠标光标和工作的全屏应用程序
- SQL SP在SSMS中正常工作,但在VC++应用程序中失败
- boost::asio 中的未经请求的消息使应用程序崩溃,没有 SSL 它可以正常工作,为什么
- MacOSX C++带有命令行应用程序的工作目录