我正在尝试在 Labwindows/CVI 中编写一个简单的 UDP 传输程序。这个想法是它创建了 2 个 UDP 通道,使用一个将数据写入端口,另一个用于接收数据并打印出来。
这是接收端:
//Called whenever data arrives on port
int CVICALLBACK udpCallback(unsigned channel, int eventType, int errCode, void *callbackData)
{
printf("Callback called\n");
//Gets the data from port
readChannel();
return 0;
}
void createReadChannel()
{
//Channel for given port, receiving from any IP address
CreateUDPChannelConfig(port, UDP_ANY_ADDRESS, 0, NULL, NULL, &readerChannel);
//Attach callback to channel (above)
SetUDPAttribute(readerChannel, ATTR_UDP_CALLBACK, udpCallback);
printf("Read channel created\n");
}
我的主要问题是,当我在调试模式下运行它时,从未调用显示的回调函数,即不打印“回调调用”,也不是在结果readChannel()
调用中存储或打印任何数据。
但是,当作为 .exe 编译和执行时,它会按预期工作。每次在该端口上接收到数据时,回调都会执行。
会导致这种情况发生的调试版本和“发布”版本之间会有什么区别?
getchar()
编辑:经过大量测试,我相信这与使用导致主线程挂起的函数等待消息有关。为什么它在发布模式下工作我不知道,但它可能与输出窗口(?)的差异有关。我的解决方案是删除回调并在它自己的线程上运行接收通道。这样线程总是在等待消息,使用:
UDPRead(readerChannel, 0, 0, UDP_WAIT_FOREVER, NULL, NULL)) < 0)
然后我的主线程可以根据需要接收消息。如果有人有任何其他信息,请告诉我。