0

OSX用のココアアプリケーションに次のコードがあります。

void *callbackInfo = NULL; // could put stream-specific data here.
            FSEventStreamRef stream;
            CFAbsoluteTime latency = 1.0; /* Latency in seconds */

            /* Create the stream, passing in a callback */
            stream = FSEventStreamCreate(NULL,
                                         &mycallback,
                                         callbackInfo,
                                         pathsToWatch,
                                         kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
                                         latency,
                                         kFSEventStreamCreateFlagFileEvents//kFSEventStreamCreateFlagNone /* Flags explained in reference */
                                         );

            /* Create the stream before calling this. */
            FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(),kCFRunLoopDefaultMode);
            FSEventStreamStart(stream);



            CFRunLoopRun();

        }

このコードは、ファイル システムの変更について通知され、それに応じて反応します (コールバック関数はスニペットにありません)。

私の問題は、 CFRunLoopRun() がブロックされていることです。つまり、コードのそれ以上の実行は停止します。ただし、ファイルシステムの変更の監視を開始できる可能性を探していますが、それを停止することもできます (たとえば、別のオブジェクトから)。

私が考えた 1 つのオプションは、ループを 1 秒間だけ開始し、その後グローバル変数をチェックすることです。しかし、私は通常、グローバル変数が好きではありません....

これを解決する方法を教えてください。オーバーヘッドを購入して、実行を別のスレッドに入れるのは良い考えでしょうか?

前もって感謝します!ノーバート

4

2 に答える 2

1

CFRunLoopRun()runloop に登録された誰かが を呼び出すまで、現在の実行ループを永遠に実行しますCFRunLoopStop()。これは、非常に凝ったことをしている場合を除き、やりたいことではありません。

コールバックを実行する場合FSEventStreamは、runloop に登録してそのままにしておくだけです。その後、runloop に対して明示的に何もする必要はありません。偶数ストリームをソースとして登録するだけで済みます。

ストリームの監視を停止したい場合は、それを呼び出しますFSEventStreamStop()

于 2015-08-01T19:44:39.723 に答える
0

Cocoa アプリケーションには暗黙的な実行ループがあるため、削除するだけですCFRunLoopRun();

実行ループでストリームをスケジュールするのではなく、Grand Central Dispatch (GCD) を介してディスパッチ キューを使用することを検討してください。

于 2015-08-01T19:45:14.533 に答える