1

我有一个使用 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

4

4 回答 4

2

您应该将库调用更改为“在任何线程中运行”,这样 UI 线程仍然可以运行事件循环。

于 2010-07-08T12:33:07.327 回答
0

QApplication当您尝试调用exec()QThread时,您可能没有创建对象。这可能会导致您的崩溃。但是,对于主要问题,我想说的是,由于事件循环未执行,您很可能在 DLL 中没有获得任何活动。

于 2009-08-13T20:36:42.933 回答
0

老NI帮助说明

只是在黑暗中开枪...... Qt 数据会在 exec 循环启动后立即破坏一些 LV 内存空间吗?

于 2009-08-13T02:04:28.737 回答
0

您可以通过 exec() 进行调试以查看 LabVIEW 崩溃的位置吗?

您还可以在调用库节点的配置页面中设置 LabVIEW 中的调试最大值。LabVIEW 对 DLL 非常挑剔。将 DLL 作为服务运行(编写运行事件循环的服务)可能更容易,然后让 LabVIEW 调用 DLL 从服务中检索数据。

于 2009-08-12T18:24:00.383 回答