2009-08-12 9 views
1

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

+0

JFYIは、QTではなくQTで書かれています。 –

答えて

0

にクロスポストされたあなたは、それは、LabVIEWがクラッシュする場所を確認するために)(execを介してデバッグすることはできますか?

コールライブラリノードの設定ページで、LabVIEWで最大デバッグを設定することもできます。 LabVIEWはDLLに苦労しています。 DLLをサービスとして実行すると(イベントループを実行するサービスを作成する)、LabVIEWがサービスからデータを取得するDLLを呼び出すことがより簡単になります。暗闇の中でだけでショット

+0

オリジナルの質問がトレースで更新されました。 – dwj

+0

Hmmm ... LabVIEWプロセスでスレッドを作成しようとすると、LabVIEWがクラッシュする可能性があります。 – CookieOfFortune

0

Old NI help note

... Qtのデータは、execループが開始された直後にLVのメモリ空間の一部をつかうことだろうか?

+0

おそらく、それは長い、暗い穴で、私は見送ることを楽しみにしていません。 – dwj

0

exec()をQThreadに呼び出すときに、QApplicationオブジェクトが作成されていない可能性があります。これはクラッシュを引き起こしている可能性があります。しかし、主な問題については、イベントループが実行されていないため、DLL内で何のアクティビティも得られていない可能性が非常に高いと言えます。

+0

QApplicationオブジェクトをDLLに入れることはできますか? – dwj

+0

@dwj:私はそれを試しませんが、あなたが他のDLLを知っていなかったり、メインアプリケーション自体にQApplicationオブジェクトが含まれていれば、それを取り除くかもしれません。 1つをチェックし、他のコードが存在しない場合は、それをインスタンス化するコードを持つことができます。 –

2

UI呼び出しスレッドがイベントループを実行できるようにライブラリ呼び出しを '任意のスレッドで実行'に変更する必要があります。

関連する問題