Python COM事件处理被阻止

2024-06-26 11:10:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python实现COM,因为我必须在两个不同的软件(dSPACE HIL environment&Vector CANOE environment)之间进行交互。我的想法是在(CANOE)CAPL脚本中更改环境变量,并希望在事件发生时对dSPACE HIL执行一些操作。现在我还没有实现任何线索

(1)所以第一个问题是当我试图使用简单的睡眠来确保测试在CANOE中完成时,执行不会发生,因为python sleep阻塞了CANOE的执行,而且我还得到了pythoncom错误:每当环境变量发生变化时,调用COM方法的python错误。因此,只有在Python中的sleep结束后,CANOE才会开始执行,而且我在CANOE中看到以下弹出消息:Server busy。在

当我使用消息框时,也就是说,测试完成后,用户必须按下按钮。我想用其他机制(如睡眠)替换它。请告诉我如何解决此问题。我已将脚本粘贴在下面。在

class EnvironmentEvents:
    def __init__ ( self ) :
        print "Initializing Environment Event Class"
 
    def OnChange ( self , value ) :
        StopTestExecution = Value
        print '% 3.2f' % StopTestExecution
        print ( 'Environment Variable Value Changed' )
 
# # # # # # # # # # # # # # # # # # # INITIALIZE CONTROL DESK # # # # # # # # # # # 
MyControlDeskHandler = Controldesk_Handler. CONTROLDESK_HANDLER ()
 
# # # # # # # # # # # # # # # # # # # INITIALIZE CANOE # # # # # # # # # # # # # #  
MyCAN                = Dispatch ( 'CANoe.Application' )
MyCANMeasurement     = MyCAN. Measurement
MyCANEnvironment     = MyCAN. Environment . GetVariable ( "env_COM_BatteryVoltage" )
My events            = Dispatch WithEvents ( MyCANEnvironment , EnvironmentEvents )
 
Test Setup = MyCAN. Configuration . Test Setup
    TestEnvs = test setup. Test Environments
Testenv = TestEnvs. Item ( 1 )
Testenv. ExecuteAll ( )            
 
    ## Msgbox (0, "Test Completed", "info", 16) ## with a message box everything is working fine

    while ( StopTestExecution > 0 ):
            print '% 3.2f' % StopTestExecution
            Sleep ( 500 )    

在 在

我的想法是将CAPL中的事件变量值作为0发送,以停止执行,直到那时循环才停止是的。但是这不起作用。在

(2)第二个问题是当OnChange事件发生时,我想在dSPACE HIL控制台中更改一些东西。为此,我必须使用dSPACE提供的库。但问题是如何在Events类中访问这个库及其方法。我试图将dSPACE library对象和参数作为参数传递给类EnvironmentEvents,如下所示。现在我只是在全球范围内使用它,它运行得很好。但如果有更好的选择,我想避免它。在

^{pr2}$

请帮我解决这些问题。如果你需要其他信息,请告诉我。在


Tags: test脚本comenvironment环境变量事件printhil
1条回答
网友
1楼 · 发布于 2024-06-26 11:10:34

{cdcom}处理消息时,{1}不需要处理消息。(MessageBox确实泵送消息,所以它可以工作。)

这里的典型解决方案是使用MsgWaitForMultipleObjectsEx和消息泵。显然pythoncom和{}有适当的包装。在

^{}需要一个句柄来等待;如果需要等待一个特定的时间,则最好创建一个可等待的计时器。奇怪的是,根据文件,win32event有{a2},但没有{}。希望这是一个文档错误。在

无论如何,如果不需要特定的时间,可以使用^{}创建一个win32事件。它可以是匿名事件;您只需要等待它。在OnChange处理程序中,可以设置事件。在

一旦你有活动,你可以等待。请原谅我的可怕的python;这是C语言的音译

def WaitAndPumpMessagesWithTimeout(hWaitHandle, dwMilliseconds) :
{
    fContinue = TRUE;

    while (fContinue)
        dwWaitId = win32event.MsgWaitForMultipleObjectsEx(1, hWaitHandle, dwMilliseconds, win32event.QS_ALLINPUT, win32event.MWMO_INPUTAVAILABLE);
        if (dwWaitId == win32event.WAIT_OBJECT_0)
             return TRUE;
        elif (dwWaitId ==  WAIT_OBJECT_0 + 1)
            pythoncom.PumpWaitingMessages();
        elif (dwWaitId  == WAIT_TIMEOUT)
           return FALSE;
    return TRUE;
}

相关问题 更多 >