2016-04-20 20 views
2

私はCocoaとAppleScriptを初めて使用しています。最近、私は何度もCocoa-AppleScriptの "do shell script"コマンドを使って何かをしたいと思っています。同時にいくつかの回を示すためにプログレスバーを同時に表示します。これは、プログレスバーを表示し、進捗状況を示しますCocoa-Applescriptで非同期に "do shell script"ですか?

property progressBar: missing value 
on applicationWillFinishLaunching_(aNotification) 
    repeat with i from 1 to 8 
     set progressBar's doublevalue to i 
     do shell script "sleep 1" 
     delay 1 
    end repeat 
end applicationWillFinishLaunching_ 

私のコードは次のようになります。ただし、プログレスバーを含むウィンドウは、繰り返しが終了するまで非アクティブになります。これは、Cocoa-AppleScriptアプリケーションにはスレッドが1つしかないため、「シェルスクリプトを実行する」コマンドを実行しているときにGUIが他のイベントを処理できないためだと思います。シェルスクリプトをバックグラウンドで "&"のようにバックグラウンドで実行しようとしましたが、ハングしたように振る舞い、多くの時間を消費します。

「シェルスクリプトを実行する」コマンドをバックグラウンドで実行することもできますが、進行状況バーの更新が完了したら通知する必要がありますが、その達成方法はわかりません。

私の質問は、「シェルスクリプトを実行する」という方法で非同期的に何かを行い、ジョブが終了したらCocoa-AppleScriptで通知する方法ですか?

(私はその「遅延1」の行を削除する場合ちなみに、プログレスバーでも誰もがその理由を知っているん、更新されていないのだろうか?)

+1

あなたはAppleScriptでこの種のことをしようとするときに問題になることがあります単一スレッドの問題については正しいです。あなたが望むことをすることができるかもしれない "ラッパー"アプリケーション( "Platypus"(http://www.sveinbjorn.org/platypus)と呼ばれる)があります。オプション。 –

+0

@ l'L'l私はこのアプリを使用しようとします。ありがとうございました! –

答えて

0

使用NSTask。 ObjCのいくつかの行を使用して、ASOCがブロック自体をサポートしていないため、ASコードをコールバックする完了ハンドラを定義する必要がありますが、それ以外の場合は必要なものを正確に実行します。

+0

実際、AppleScriptを使用してこれを行う理由は、ObjCを全く習得したくないということです。でも、助けてくれてありがとう。 :) –

+1

サブプロセスを非同期で実行したい場合は、完了通知を取得するには 'NSTask'を使います。はい、ASOCでのブロックサポートの不足は有名なことですが、それは克服できません。 '&'で 'do shell script'を使用してもすぐには返されないのは、サブプロセスのstdoutとstderrパイプがあなたのプロセスにまだ接続されているからです。しかし、それらをリダイレクトすると、プロセスはフィードバックを受け取らなくなります。間違いなくあなたがそれをクルージングすることができる狂気の方法がありますが、あなたは結び目であなた自身を結びつけていて、いろいろな種類の厄介なものを潜在的に作り出しています。 ObjCを使うだけで簡単です。 – foo

+0

あるいはAppleScriptが正しいことをしているアプリケーションスクリプトを実行していないと仮定すると、AppleScriptを完全に使用することを忘れてしまい、代わりにSwiftを学ぶことができます。少なくともスウィフトでは、大規模で知識の豊富なユーザーコミュニティ、豊富なツールとドキュメントのサポート、そしてうまくいけないことは愚かではないにもかかわらず、アンティッツとしてバグがあっても絶望的に瀕死の言語ではない。しかし、ええ、それは未来です。 – foo

関連する問題