Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我的应用程序仅在OS X上最小化时,QT UDP套接字将挂起_Qt_Sockets - Fatal编程技术网

当我的应用程序仅在OS X上最小化时,QT UDP套接字将挂起

当我的应用程序仅在OS X上最小化时,QT UDP套接字将挂起,qt,sockets,Qt,Sockets,我有一个基于QT的应用程序,已经在Windows上运行了好几年。它打开3个不同的UDP套接字,将readyRead信号连接到插槽,并解析所有三个端口的数据。我对应用程序的这部分没有任何问题 我最近使用Qt5.4将其移植到OSX。在我使用标题栏上的小橙色按钮最小化应用程序之前,它似乎运行良好。当我恢复它时,只有一个套接字继续接收数据。我已经验证了数据仍然被发送到套接字——只是没有触发readyRead 如果我重新启动,一切正常 工作套接字和其他套接字之间的一个区别是,工作套接字连接到一个必须提示的

我有一个基于QT的应用程序,已经在Windows上运行了好几年。它打开3个不同的UDP套接字,将readyRead信号连接到插槽,并解析所有三个端口的数据。我对应用程序的这部分没有任何问题

我最近使用Qt5.4将其移植到OSX。在我使用标题栏上的小橙色按钮最小化应用程序之前,它似乎运行良好。当我恢复它时,只有一个套接字继续接收数据。我已经验证了数据仍然被发送到套接字——只是没有触发readyRead

如果我重新启动,一切正常

工作套接字和其他套接字之间的一个区别是,工作套接字连接到一个必须提示的设备,因此在1 Hz时,我向套接字写入数据。其他套接字应该在没有提示的情况下吐出数据

我确实尝试过向他们发送数据,只是为了确保套接字不会在操作系统级别挂断,但这没有什么区别。事实上,一切都没有改变。每个套接字以相同的方式打开——我创建套接字,将其绑定到端口号,然后将其连接到插槽

altitudeSocket = new   QUdpSocket(this);
altitudeSocket->bind(altitudeInSocketNumber);
connect (altitudeSocket,SIGNAL(readyRead()),this,SLOT(sledSocketDataPending()));

switchSocket = new   QUdpSocket(this);
switchSocket->bind(switchInSocketNumber);
connect (switchSocket, SIGNAL(readyRead()),this,SLOT(sledSocketDataPending()));

depthSocket = new   QUdpSocket(this);
depthSocket->bind(depthInSocketNumber);
connect (depthSocket, SIGNAL(readyRead()),this,SLOT(sledSocketDataPending()));

在OSX编程中,我是否需要做一些特殊的事情来处理窗口最小化

这可能是一个Qt错误,但您需要创建一个独立的测试用例。最好使它成为单个可执行文件、单个源文件,并让它自己启动:请参阅或。无论如何,您都需要测试用例才能将其转化为有效问题。如果没有看到这样的测试用例,就无法回答您的问题。当然,您可以将数据发送给自己。另一个建议是:您可以将拥有套接字并拥有插槽的
QObject
移动到另一个线程吗?这样,即使OSX以某种方式阻止GUI线程,它仍然可以工作。虽然我不认为这是问题的根源。据我所知,这可能是一个OSX错误。你可能需要两个测试用例,否则就要用相同的方法:一个使用纯C++,本地GUI和C Socket API,另一个做同样的事情,但是移植到QT。你可能会尝试禁用APP NAP来查看这是不是原因。你可以在这里详细阅读如何做到这一点:直到今天,我还无法回到这个问题上来。我禁用了AppNap,但没有看到行为发生任何变化。我尝试了其他一些简单的方法——比如分离插槽,但没有看到任何变化。我尝试将所有UDP通信发送到一个套接字(以前工作过的套接字),发现当我这样做并最小化应用程序时,套接字也停止了。这似乎表明了与传入数据的某种关系。我看不出有什么关系,但这就是症状。下一步我将尝试多线程,你有什么收获吗?我有一个类似的问题,我的qt套接字(尝试了udp和tcp)在切换到另一个应用程序后停止发送数据,然后返回到该应用程序并要求它写入更多数据(按下按钮)。这只发生在osx上,我已经在运行el caption的2台MacBook上试用过。我已经做了三天了。在Windows上运行良好。