我想從一個C#項目中運行一個JSFL腳本,其中JSFL腳本打開一個.fla文件,修改它n次,並在關閉之前導出n .swf文件。從C#項目中,我通過Process類啓動JSFL腳本。我嘗試通過myProcess.WaitForExit()命令等待JSFL進程完成,但它不起作用。我的代碼C#的其餘部分在JSFL進程完成導出其.swf文件之前執行。有什麼辦法可以拋出C#項目可以從JSFL文件或其他解決方案中捕獲的東西嗎?失速程序,直到JSFL文件完成
回答
一個解決方案(儘管很可能不是最好的解決方案)是讓您的C#代碼查找正在創建的SWF文件。只有更新/創建完成後,JSFL腳本纔會完成,因此您知道C#可以繼續使用。如果無法知道C#程序需要查找多少個SWF文件,則可以讓JSFL腳本寫入某種類型的日誌文件,並讓C#程序每隔一段時間讀取一次該日誌對於某種標記來表示JSFL腳本已完成它的任務。當然,這可能遠不是最好的方法(我不知道C#足夠了解你所看到的是設計還是錯誤的跡象)。但是,運行JSFL/Flash可能是完全異步的,如果是這樣,也許日誌文件方法是解決問題的最快途徑。
我與另一個調用外部JSFL腳本的應用程序有同樣的問題。
我所做的是將文件完成後寫入目標目錄,然後在調用應用程序中輪詢該文件。只要文件出現,我知道任務已完成,並刪除臨時文件,然後繼續。噢 - 在開始之前,我會查找並刪除任何臨時文件,以免發生誤報。
這不像事件那麼好,但你必須與你所得到的一起工作。
但是,像這樣涉及文件監視器並不是最好的解決方案,所以我抓住了Flash進程並持續監視進程標題,並在完成執行後告訴JSFL爲Flash窗口渲染一些窗口標題。
你試過設置一個自定義的Listener,它會在JSFL完成時執行一個函數。不要忘記,它仍然基於ECMA這是一種程序語言。順便說一句,JSFL有一個低級C API。 C LEVEL API
這是絕對有可能的,而且我已經發布瞭解決方案在這裏堆棧溢出,完成一個詳細的問題說明,所有的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腳本已經完成並且繼續安全。
- 1. 等待直到外部過程完成寫入文件
- 2. 迅速完成處理程序語法
- 3. Scala -jline文件完成程序導致找不到文件(linux)
- 4. 直到腳本完成後文件才寫完
- 5. Outlook事件處理程序完成後,Outlook Interop導致Outlook失速*
- 6. 避免用戶關閉7za.exe程序,直到進程完成
- 7. JavaFX - SetText()到TextArea不會執行,直到程序完成
- 8. 等待,直到線程完成擺好
- 9. Nacl_IO阻塞線程,直到fopen完成
- 10. 停止線程直到其他完成
- 11. pyOpenSSL + HTTPServer:請求不會完成,直到所有進程完成
- 12. 阻塞,直到事件完成
- 13. 需要保存批處理文件完成,直到OSQL命令完成
- 14. GUI直到代碼完成
- 15. 等待,直到application.run完成
- 16. 等待,直到fs.readFileSync完成
- 17. 等待,直到Application.Calculate完成
- 18. 等待,直到gobalEval完成
- 19. 塊,直到ExecutorService的完成
- 20. 等待,直到AJAX完成
- 21. C#下載程序凍結,直到完成
- 22. Ruby - 延遲ruby程序,直到shell命令執行完成
- 23. 多處理:主程序停止,直到處理完成
- 24. Java Applet GUI直到小程序完成下載才顯示
- 25. 循環HttpWebRequest掛起程序,直到它完成
- 26. 暫停Perl腳本,直到完成外部程序
- 27. 如何暫停程序,直到nsurlconnection完成?
- 28. 如何等待應用程序,直到countDownTimer完成
- 29. 完整路徑通過jsfl
- 30. JSFL刪除Flash aso文件
因此,我發現這種情況發生的原因是因爲JSFL文件在命令提示符中立即執行,而JSFL文件中的實際事件需要一些時間才能完成(如導出多個.swfs)。現在的問題是,JSFL文件可以等待執行所有的命令之後,它會發回命令提示符,表明它已完成? – CodedMonkey
「執行JSFL文件」實際上是「啓動flash.exe進程並將JSLF文件名作爲參數傳遞給它」。這是立即完成的。 Flash進程將處理JSLF文件並保持無限期打開狀態,因此等待進程將鎖定您的應用程序,直到您手動關閉Flash。當Flash完成內部操作(如處理JSFL文件)時,外部應用程序可以知道的唯一方法是在JSLF腳本的末尾調用「runCommandLine」向主應用程序發送一個信號,指示腳本已到達末尾。看到我發佈的答案。 – Triynko