如何将外部应用程序与 DigitalMicrograph 脚本同步?

How can one synchronize an external application with a DigitalMicrograph script?

This question has been inspired by the question .

如何在 其他 而非 DigitalMicrograph 的应用程序中编写作用于 'trigger events' 的脚本?

即某些脚本功能应由外部应用程序触发。

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

但是,可以通过将系统的文件系统用作消息队列来解决该问题。为此,在后台有一个脚本 运行,它定期检查某个文件是否存在,并让 external 应用程序在它想要​​触发脚本时创建这样一个文件- 数码显微照片中的动作。文件内容 - 如果它是一个简单的文本文件 - 也可用于在两个应用程序之间传输信息。

这是一个示例脚本,它将等待文件 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,但实际检查会在主线程上执行。