2012-01-11 12 views
2

Mac OS Xでは、Cocoaはイベント駆動型です。これは私がUIによって動かされることを意味します。ユーザーが何かをクリックしたり特定の領域を移動すると、イベントハンドラが呼び出されます。 MainはNSApplicationMain()を呼び出して、プログラムが終了するまで無限ループを作成します。Cocoaのイベント駆動型システム:バックグラウンドタスクはどこで実行されますか?

ユーザーが操作していないタスクはどうですか?プログラムの基本機能を提供するために、バックグラウンドで作業する必要のある作業はどこに置くのですか?たとえば、Photo Boothは、ユーザーがUIとやりとりしたときに特定のことを行います(つまり、ユーザーが特定のボタンをクリックしたときのビデオカメラの変更)。しかし、Photo Boothはカメラからフレームを連続的に取り出してビデオストリームを提供しています。

私の質問は、非UIタスクコードはどこに行くのですか? Main()は実際には可能ではありません。なぜなら、私は、プログラムが始まったときからではなく、プログラムの生涯を通して実行されるタスクが必要だからです。

私はMac OS X Snow Leopard(すべてのMacシステム(Lion OS X)で動作するものを望み、XcodeでObj-C Cocoaアプリケーションを使用しています)

答えて

8

アプリケーションのココアベースのアプリケーションであれば、RunLoopsへのアクセス権があります。

あなたのアプリがやりたいことがあれば、RunLoopを使って実行してください。通常、これは他のスレッドで行われますが、UIスレッドがブロックされないほど軽量であれば、メインスレッドのRunLoopでコードを実行できます。

アップルのThread Programming Guideを読むことをお勧めします。

Grand Central Dispatchでは、プログラミングモデルが今日のマルチコアシステムを利用するように変更されているため、タスクを定義してOSがそのタスクを管理できるようにします。

+0

ありがとうございます、スレッドは完璧なサウンドです。私は、すべての変数を宣言してスレッドを開始するための中央の場所が必要です。私はどこでこれをやるだろうか? – fdh

+1

最後に、あなたのタスクは何かに応答して常に実行されます(何かが「時間が過ぎている」または「アプリケーションが起動した」場合でも)。 Photo Boothの例のように、ビデオキャプチャライブラリからのコールバックに応答して実行されます。ネットワークアプリケーションの場合、ネットワーク上の着信パケットに応答して実行されます。 「イベントドリブン」はGUIイベントにのみ適用されるものではありません。 –

+0

アプリの起動によって「駆動」されるようにするには、コンソールアプリケーションと同じようにメインに配置しますか? – fdh

関連する問題