LabVIEW阻断Qt信号?
我有一个LabVIEW 8.6程序,它使用的是用Qt编写的DLL;DLL侦听TCP端口以获取传入消息并更新一些内部数据。我的LabVIEW程序偶尔会调用DLL来读取内部数据。DLL与另一个Qt程序完美配合(即从TCP端口接收数据)。但是,它在我的LabVIEW程序中根本不起作用 我已经在DLL上附加了一个调试器,可以看到来自LabVIEW的调用进入其中——我的获取内部数据的函数正在被调用,我可以单步执行它。但是,从TCP获取数据的代码从未被调用;看起来TCP端口上的传入数据信号从未触发 我知道这听起来像是Qt问题,但DLL与另一个Qt程序完美配合。不幸的是,它在LabVIEW中失败得很惨 一种理论:LabVIEW阻断Qt信号?,qt,dll,labview,Qt,Dll,Labview,我有一个LabVIEW 8.6程序,它使用的是用Qt编写的DLL;DLL侦听TCP端口以获取传入消息并更新一些内部数据。我的LabVIEW程序偶尔会调用DLL来读取内部数据。DLL与另一个Qt程序完美配合(即从TCP端口接收数据)。但是,它在我的LabVIEW程序中根本不起作用 我已经在DLL上附加了一个调试器,可以看到来自LabVIEW的调用进入其中——我的获取内部数据的函数正在被调用,我可以单步执行它。但是,从TCP获取数据的代码从未被调用;看起来TCP端口上的传入数据信号从未触发 我知道这
- LabVIEW调用DLL时,事件循环未运行
- 在Qt DLL的run()函数中,我调用socket->waitForDisconnected()。可能是因为事件循环未运行,DLL未处理传入事件?如果我调用exec()启动事件循环,LabVIEW将崩溃(LabVIEW 8.6开发系统遇到问题,需要关闭。“):
这个问题被交叉发布在你能通过exec()进行调试,看看它在哪里崩溃LabVIEW吗 您还可以在“调用库”节点的“配置”页面的LabVIEW中设置调试最大值。 LabVIEW对DLL很挑剔。将DLL作为服务运行(编写运行事件循环的服务),然后让LabVIEW调用从服务检索数据的DLL可能更容易。
只是在黑暗中拍摄…在exec循环启动后,Qt数据是否会立即占用一些LV内存空间?您可能没有在尝试调用
exec()时创建的QApplication
对象
在QThread中。这可能会导致崩溃。但是,对于主要问题,我想说的是,由于事件循环未执行,您很可能没有在DLL中获得任何活动。您应该将库调用更改为“在任何线程中运行”,这样UI线程仍然可以运行事件循环。Hmmm…我想知道是否试图在LabVIEW进程中创建一个线程,这几乎肯定会使LabVIEW崩溃。JFYI,它被写为Qt,而不是Qt。可能,但这是一个很长的黑洞,我不希望看到它。你能在DLL中包含QApplication对象吗?@dwj:我不会尝试,但如果你不知道其他DLL或主应用程序,你可能会侥幸逃脱应用程序本身包含一个QApplication对象。您可以使用一些代码来检查一个对象,并在没有其他对象存在的情况下对其进行实例化。
AppName: labview.exe AppVer: 8.6.0.4001 ModName: qtcored4.dll
ModVer: 4.5.1.0 Offset: 001af21a
QThread::exec() -> eventLoop.exec() -> if (qApp->thread() == thread())
in the call to
QObject::thread() {
return d_func()->threadData->thread;
}