Qtで書かれたDLLを使用しているLabVIEW 8.6プログラムがあります。 DLLは着信メッセージのTCPポートをリッスンし、内部データを更新します。私のLabVIEWプログラムは時折内部データを読み込むためにDLLを呼び出します。 DLLは、別のQtプログラムと完全に動作する(すなわち、TCPポートからデータを受信する)。しかし、私のLabVIEWプログラムではまったく動作しません。LabVIEWがQt信号をブロックしていますか?
私はDLLにデバッガを接続しており、LabVIEWからの呼び出しを見ることができます。私の内部データを取得する機能が呼び出されています。 TCPからデータを取得するコードは決して呼び出されません。 TCPポート上の着信データの信号がトリガーされないように見えます。
私はこれがQtの問題のように聞こえるが、DLLは別のQtプログラムで完璧に動作することは知っている。残念ながら、それはLabVIEWで悲惨に失敗します。
一説:LabVIEWはQtのDLLの実行()関数でDLL
- を呼び出したときにイベントループが実行されていない
、私は)(socket-> waitForDisconnected呼び出します。イベントループが実行されていないため、DLLが着信イベントを処理していない可能性があります。私はイベントループを開始するために)(幹部を呼び出す場合、LabVIEWがクラッシュする(LabVIEWの8.6開発システムで問題が発生したため終了します」。):
おそらく
AppName: labview.exe AppVer: 8.6.0.4001 ModName: qtcored4.dll ModVer: 4.5.1.0 Offset: 001af21a
- 私が呼びます残念ながら、DLL内のイベントループを蹴飛ばすと、LabVIEWがダウンします。
信号を保持する方法に関するすべての考えLaの時にDLLで動くbVIEWは呼び出しプログラムですか?
EDIT EXECのデバッグトレース()呼び出し:
QThread::exec() -> eventLoop.exec() -> if (qApp->thread() == thread())
in the call to
QObject::thread() {
return d_func()->threadData->thread;
}
マクロQ_DECLARE_PRIVATE(QObjectを)、2番目の呼び出しは、クラッシュをトリガします。
EDIT 2009年8月17日:ステータス更新
これは私がLabVIEWで直接TCPリスナーを実装することを決定した仕事を得るためのさまざまな方法を試しての2日後。私のLabVIEWアプリケーションは、DLL経由でデータを送信し、TCP経由でデータを受信します。すべてがうまくいきます。
この質問はhttp://forums.ni.com/ni/board/message?board.id=170&thread.id=431779
JFYIは、QTではなくQTで書かれています。 –