0

アプリケーションを Mac OS X に移植しています。

Mac OS X でも次のタスクを実行する必要があります。スレッド A は、別のスレッド B のメッセージ キューにメッセージを投稿する必要があります。これらのメッセージには、いくつかのカスタム メッセージも含まれます。EXIT_LOOP のような特定のメッセージで、スレッド B はメッセージ ループから抜け出します。

CFRunLoop を使用して、スレッド B のメッセージ ループを開始しました。

スレッド A がスレッド B にメッセージを投稿する方法がわかりません。

Windows では、これは PostThreadMessage である可能性があります。このための Mac OS X への直接の移植はないかもしれませんが、Mac OS X でそれを行う方法があるに違いありません。

スレッド B はスレッド A を認識していませんが、スレッド A はスレッド B を認識していることに注意してください。

Windows コード:

MessageLoop () {
    MSG message;
    BOOL ret;
    while(ret = GetMessage(&message, NULL, 0, 0) != 0) {
        if(ret == -1)
            break;

         if(UseMessage(message) = EXIT)
             break;

    }

}

int UseMessage (MSG Message)
{
   switch(Message) {

   //Process various messages.

   case I_AM_COMPLETE:
       return EXIT;

   }
}


//Thread A:
MessageLoop ();
//Cleanup

//Thread B:
PostThreadMessage(threadidofA, I_AM_COMPLETE, 0, 0);

このコードにより、より明確になると思います。Mac OS X で同等の機能が必要です。

4

1 に答える 1

1

一般的なアドバイスとして、移植作業には別の方法を取る必要があります。Win32 コーディング戦略を Mac のものに「音訳」しようとしないでください。Mac のコーディング手法に合わせて設計を根本から見直します。

とにかく、似たようなことを達成するためのさまざまな方法があります。おそらく最も単純なのは、スレッド BNSRunLoopではなくCFRunLoop. 次に、スレッド A を使用-[NSObject performSelector:onThread:withObject:waitUntilDone:]して、スレッド B でメソッドを実行できます。

于 2013-07-05T08:37:03.970 に答える