Events 如何将外部应用程序与数字显微照片脚本同步?

Events 如何将外部应用程序与数字显微照片脚本同步?,events,synchronization,external,dm-script,Events,Synchronization,External,Dm Script,这个问题受到了这个问题的启发 如何编写一个脚本来处理除数字显微照片以外的应用程序中的“触发事件”? i、 e.某些脚本功能应由外部应用程序触发。脚本语言在其当前状态下不提供许多“外部”接口。可以使用命令LaunchExternalProcess调用外部进程并等待进程完成,但外部进程调用没有直接的方法,即在DigitalMicrograph中启动脚本操作 但是,可以通过将系统的文件系统用作消息队列来解决该问题。为此,在后台运行一个脚本,定期检查某个文件是否存在,并让外部应用程序在需要触发Digit

这个问题受到了这个问题的启发

如何编写一个脚本来处理除数字显微照片以外的应用程序中的“触发事件”?
i、 e.某些脚本功能应由外部应用程序触发。

脚本语言在其当前状态下不提供许多“外部”接口。可以使用命令
LaunchExternalProcess
调用外部进程并等待进程完成,但外部进程调用没有直接的方法,即在DigitalMicrograph中启动脚本操作

但是,可以通过将系统的文件系统用作消息队列来解决该问题。为此,在后台运行一个脚本,定期检查某个文件是否存在,并让外部应用程序在需要触发DigitalMicrograph中的脚本操作时创建这样的文件。文件内容(如果是简单的文本文件)也可用于在两个应用程序之间传输信息

下面是一个示例脚本,它将等待根文件夹中出现文件
Trigger.txt
。每10秒进行一次检查

class WaitForExternal
{
    string triggerFilePath
    number taskID
    void WaitOnTrigger( object self )
    {
        if ( DoesFileExist( triggerFilePath ) )
        {
            Result( GetTime(1) + ": Triggered! Now act..." )
            If ( TwoButtonDialog( "Do you want to reset the trigger?", "Reset", "Stop" ) )
            {
                DeleteFile( triggerFilePath )
            }
            else
            {
                RemoveMainThreadTask( taskID )
            }
        }
        else
        {
            Result( GetTime(1) + ": not yet\n" )
        }
    }

    object Init( object self, string triggerPath, number waitSec ) 
    { 
        triggerFilePath = triggerPath
        taskID = self.AddMainThreadPeriodicTask( "WaitOnTrigger", waitSec )
        return self
    }
}

// Main script
{
    string triggerPath = "C:\\Trigger.txt"
    number pollingWait = 10
    Alloc(WaitForExternal).Init( triggerPath, pollingWait )
}

请注意,定期任务在后台空闲等待,不会干扰CPU,但实际检查将在主线程上执行。

在扩展:从GMS 3.0.1开始,还可以通过DigitalMicrograph.exe的命令行参数在DigitalMicrograph中“启动”脚本。看见