停止程序直到 JSFL 文件完成
Posted
技术标签:
【中文标题】停止程序直到 JSFL 文件完成【英文标题】:Stalling program until JSFL file finishes 【发布时间】:2011-11-11 16:30:17 【问题描述】:我正在尝试从 C# 项目中运行 JSFL 脚本,其中 JSFL 脚本会打开一个 .fla 文件,对其进行 n 次修改,并在关闭前导出 n 个 .swf 文件。在 C# 项目中,我通过 Process 类启动 JSFL 脚本。我尝试通过 myProcess.WaitForExit() 命令等待 JSFL 进程完成,但它不起作用。我的 C# 代码的其余部分在 JSFL 进程完成导出其 .swf 文件之前执行。有什么方法可以抛出 C# 项目可以从 JSFL 文件或其他解决方案中捕获的东西?
【问题讨论】:
【参考方案1】:一种解决方案(虽然很可能不是最好的)是让您的 C# 代码查找正在创建的 SWF 文件。只有在更新/创建它们之后,JSFL 脚本才会完成,因此您知道继续使用 C# 将是安全的。如果无法知道 C# 程序需要查找多少 SWF 文件,您可以改为让 JSFL 脚本写入某种日志文件,并让 C# 程序每隔一段时间读取该日志,查看某种标记来表明 JSFL 脚本已经完成了它的任务。
当然,这可能不是最好的方法(而且我对 C# 的了解还不够,无法知道您所看到的内容是设计使然还是有问题的迹象)。但可能只是运行 JSFL/Flash 是完全异步的,如果是这样,日志文件方法可能是解决问题的最快途径。
【讨论】:
所以我发现发生这种情况的原因是 JSFL 文件在命令提示符下立即执行,而 JSFL 文件中的实际事件需要一些时间才能完成(例如导出多个 .swfs)。现在的问题是,JSFL 文件是否可以等待执行所有命令,然后再向命令提示符发出信号表明它已完成? “执行 JSFL 文件”实际上是“启动 flash.exe 进程并将 JSLF 文件名作为参数传递给它”。这就是立即完成的事情。 Flash 进程将处理 JSLF 文件并无限期地保持打开状态,因此等待该进程只会锁定您的应用程序,直到您手动关闭 Flash。当 Flash 完成内部操作(如处理 JSFL 文件)时,外部应用程序可以知道的唯一方法是在 JSLF 脚本末尾调用“runCommandLine”,以向您的主应用程序发送一个信号,指示脚本已到达末尾。请参阅我发布的答案。【参考方案2】:我在调用外部 JSFL 脚本的另一个应用程序中遇到了同样的问题。
我所做的是在完成后将文件写入目标目录,然后在调用应用程序中轮询该文件。文件一出现,我就知道任务已经完成,我删除了临时文件,然后继续。哦 - 在开始之前,我会查找并删除任何临时文件,以免误报。
它不如活动好,但你必须利用你所拥有的。
【讨论】:
【参考方案3】:您是否尝试过设置一个自定义侦听器,该侦听器将在 JSFL 完成时执行一个函数。不要忘记它仍然基于 ECMA,它是一种程序语言。 顺便说一句,JSFL 有一个 LOW-LEVEL C API。 C LEVEL API
【讨论】:
【参考方案4】:这是绝对可能的,我已经在此处发布了关于堆栈溢出的解决方案,并附有详细的问题描述以及实现它所需的所有 C# 和 JSFL 源代码:Automating publishing of FLA files; calling Process.Start multiple times
总而言之...首先,等待 JSFL 脚本进程是没有用的,因为您实际上是在调用 Flash.exe,它在 JSFL 完成后将保持打开/运行状态,因此您将等待永远不会发生的进程退出事件。
诀窍是在执行 windows 命令行命令的 JSFL 脚本末尾使用 JSFL 函数,该调用将向您的 C# 应用程序发出 JSLF 脚本已完成的信号。所以基本上你将拥有你的 C# 应用程序的主实例,但你想修改你的 C# 应用程序,以便可以从带有特定开关的命令行运行第二个实例。当您使用特定开关(来自 JSLF 文件)调用 C# 应用程序时,您希望程序在应用程序的主实例中简单地发出等待句柄信号,然后关闭,而不是正常运行。我使用了一个名为 XDMessaging 的简单第三方开源库,它促进了这种进程间通信。它允许您在 C# 应用程序中打开一个命名通道,该通道可以接收来自第二个实例的命令,向主实例发出 JSFL 脚本已完成并且可以继续安全的信号。
【讨论】:
【参考方案5】:但是像这样涉及文件观察器并不是最好的解决方案,所以我捕获 Flash 进程并密切关注进程标题,并告诉 JSFL 在完成执行后为 Flash 窗口渲染一些窗口标题。
【讨论】:
以上是关于停止程序直到 JSFL 文件完成的主要内容,如果未能解决你的问题,请参考以下文章