Labwindows/CVI で簡単な UDP 転送プログラムを作成しようとしています。アイデアは、2 つの UDP チャネルを作成し、1 つを使用してデータをポートに書き込み、もう 1 つを使用してデータを受信して出力するというものです。
受信側は次のとおりです。
//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)
そして、メインスレッドは必要に応じてメッセージを取得できます。誰かが追加情報を持っている場合は、私に知らせてください。