我有一个使用 Qt 编写的 DLL 的 LabVIEW 8.6 程序;DLL 侦听 TCP 端口以获取传入消息并更新一些内部数据。我的 LabVIEW 程序偶尔会调用 DLL 来读取内部数据。DLL 与另一个 Qt 程序完美地工作(即从 TCP 端口接收数据)。但是,它根本不适用于我的 LabVIEW 程序。
我已将调试器附加到 DLL 中,并且可以看到来自 LabVIEW 的调用进入其中——我的用于获取内部数据的函数正在被调用,我可以单步执行它。但是从 TCP 获取数据的代码永远不会被调用;看起来 TCP 端口上的传入数据信号从未被触发。
我知道这听起来像是一个 Qt 问题,但 DLL 可以与另一个 Qt 程序完美配合。不幸的是,它在 LabVIEW 中惨遭失败。
一种理论:
LabVIEW调用DLL时事件循环未运行
- 在Qt DLL 的run() 函数中,我调用socket->waitForDisconnected()。也许 DLL 没有处理传入事件,因为事件循环没有运行?如果我调用 exec() 来启动事件循环,LabVIEW 会崩溃(LabVIEW 8.6 开发系统遇到问题,需要关闭。”):
应用名称:labview.exe 应用版本:8.6.0.4001 模组名称:qtcored4.dll ModVer:4.5.1.0 偏移量:001af21a
- 也许当我从另一个 Qt 程序调用 DLL 时,该程序的事件循环允许 DLL 看到 TCP 信号。不幸的是,在 DLL 中启动事件循环会导致 LabVIEW 失效。
当LabVIEW是调用程序时,关于如何保持信号在DLL中运行的任何想法?
编辑exec() 调用的调试跟踪:
QThread::exec() -> eventLoop.exec() -> if (qApp->thread() == thread())
in the call to
QObject::thread() {
return d_func()->threadData->thread;
}
第二次调用宏 Q_DECLARE_PRIVATE(QObject) 触发崩溃。
编辑 2009 年 8 月 17 日:状态更新
经过两天尝试各种方法使其工作后,我决定直接在 LabVIEW 中实现 TCP 侦听器。我的 LabVIEW 应用程序通过 DLL 发送数据并通过 TCP 接收数据。一切运作良好。
这个问题被交叉发布在http://forums.ni.com/ni/board/message?board.id=170&thread.id=431779