我想从Python访问Matlab(在Windows上,通过COM接口远程访问)。我的目标是:Matlab正在做一些工作,永久性地改变某个变量的值。我需要知道值何时超过某个常数。现在,我在一个不确定的循环中轮询Matlab变量的值,超过这个值就会中断。然而,当我懒洋洋地坐在那里听的时候,我想让Matlab来做这件事,告诉我。有没有办法做到这一点,如何做到最好?我曾想过定义一个传递给Matlab的回调函数,在exceedge事件上,它会触发Python中非繁忙等待循环的中断,但我怀疑它是否能起作用。我在Matlab和Python方面都不是很有经验,所以我们非常感谢提示。在
还有很多其他的代码,但现在基本上是
connectToMatlab(*args)
while True:
val = getValueFromMatlab()
if val > constant or timeout: break
我的想法是
^{pr2}$然后让Matlab对val > constant
调用breakLoop()
。但是,我不知道是否可以让Matlab通过回调来实现这一点,如果可以,我不知道如何实现这样一个breakLoop()
-函数。在
您可以用另一种方法来实现这一点,并使用文件系统作为在MATLAB和Python之间传递消息的一种方式。在
在MATLAB代码中,每次更改变量时,检查它是否超过某个阈值。如果是,请在预定位置创建一个新文件。把这看作是触发事件。在
现在在python代码中,使用文件系统中listen到changes的一些可用方法,并通过指示某个变量来响应以中断循环。在
编辑
以下是建议解决方案的框架:
matlab脚本.m
Python_代码.py
^{pr2}$^{} 函数首先检查指定对象的状态。如果它是非signaled,则调用线程将进入一个有效的等待状态,并且在等待对象被发出信号(或超时时间间隔过去)之前,它只消耗很少的处理器时间。在
你可以看到,当线程引用处于非信号状态的对象时,会有一个即时的上下文切换,也就是说,它从处理器上取下并进入等待/休眠模式。稍后当对象发出信号时,线程被放回可运行队列,并准备好执行。在
在这种等待状态下,虽然上下文切换有一定的开销,但在等待状态下不会浪费CPU周期。在
将其与“poll and wait”方法进行比较,后者在某种循环中等待并检查感兴趣对象的状态。这被称为spin或busy wait,这可能会浪费CPU周期。在
现在多亏了pywin32模块,我们可以直接使用那些^{} 函数。实现应该是MSDN中给定的standard example的直接端口。在
或者,您可以将PyQt库与其QFileSystemWatcher类一起使用,而不是直接使用win32api。在
相关问题 更多 >
编程相关推荐