Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LabVIEW阻断Qt信号?_Qt_Dll_Labview - Fatal编程技术网

LabVIEW阻断Qt信号?

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 8.6程序,它使用的是用Qt编写的DLL;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开发系统遇到问题,需要关闭。“):
第二个调用宏Q_DECLARE_PRIVATE(QObject)触发崩溃

编辑2009年8月17日:状态更新

经过两天的尝试,我决定直接在LabVIEW中实现一个TCP侦听器。我的LabVIEW应用程序通过DLL发送数据,并通过TCP接收数据。一切正常


这个问题被交叉发布在

你能通过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;
}