2011-09-06 20 views
1

我想從一個C#項目中運行一個JSFL腳本,其中JSFL腳本打開一個.fla文件,修改它n次,並在關閉之前導出n .swf文件。從C#項目中,我通過Process類啓動JSFL腳本。我嘗試通過myProcess.WaitForExit()命令等待JSFL進程完成,但它不起作用。我的代碼C#的其餘部分在JSFL進程完成導出其.swf文件之前執行。有什麼辦法可以拋出C#項目可以從JSFL文件或其他解決方案中捕獲的東西嗎?失速程序,直到JSFL文件完成

回答

2

一個解決方案(儘管很可能不是最好的解決方案)是讓您的C#代碼查找正在創建的SWF文件。只有更新/創建完成後,JSFL腳本纔會完成,因此您知道C#可以繼續使用。如果無法知道C#程序需要查找多少個SWF文件,則可以讓JSFL腳本寫入某種類型的日誌文件,並讓C#程序每隔一段時間讀取一次該日誌對於某種標記來表示JSFL腳本已完成它的任務。當然,這可能遠不是最好的方法(我不知道C#足夠了解你所看到的是設計還是錯誤的跡象)。但是,運行JSFL/Flash可能是完全異步的,如果是這樣,也許日誌文件方法是解決問題的最快途徑。

+0

因此,我發現這種情況發生的原因是因爲JSFL文件在命令提示符中立即執行,而JSFL文件中的實際事件需要一些時間才能完成(如導出多個.swfs)。現在的問題是,JSFL文件可以等待執行所有的命令之後,它會發回命令提示符,表明它已完成? – CodedMonkey

+0

「執行JSFL文件」實際上是「啓動flash.exe進程並將JSLF文件名作爲參數傳遞給它」。這是立即完成的。 Flash進程將處理JSLF文件並保持無限期打開狀態,因此等待進程將鎖定您的應用程序,直到您手動關閉Flash。當Flash完成內部操作(如處理JSFL文件)時,外部應用程序可以知道的唯一方法是在JSLF腳本的末尾調用「runCommandLine」向主應用程序發送一個信號,指示腳本已到達末尾。看到我發佈的答案。 – Triynko

2

我與另一個調用外部JSFL腳本的應用程序有同樣的問題。

我所做的是將文件完成後寫入目標目錄,然後在調用應用程序中輪詢該文件。只要文件出現,我知道任務已完成,並刪除臨時文件,然後繼續。噢 - 在開始之前,我會查找並刪除任何臨時文件,以免發生誤報。

這不像事件那麼好,但你必須與你所得到的一起工作。

-2

但是,像這樣涉及文件監視器並不是最好的解決方案,所以我抓住了Flash進程並持續監視進程標題,並在完成執行後告訴JSFL爲Flash窗口渲染一些窗口標題。

2

你試過設置一個自定義的Listener,它會在JSFL完成時執行一個函數。不要忘記,它仍然基於ECMA這是一種程序語言。順便說一句,JSFL有一個低級C API。 C LEVEL API

0

這是絕對有可能的,而且我已經發布瞭解決方案在這裏堆棧溢出,完成一個詳細的問題說明,所有的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腳本已經完成並且繼續安全。