PostThreadMessage эквивалент в Mac OS X

Я портирую приложение на Mac OS X.

Мне нужно выполнить следующую задачу на Mac OS X тоже. Поток A должен отправить сообщение в очередь сообщений другого потока B. Это сообщение также включает в себя некоторые пользовательские сообщения.
В конкретном сообщении, таком как EXIT_LOOP, поток B выходит из цикла сообщений.

Я начал цикл сообщений для потока B, используя CFRunLoop.

Теперь я не могу найти, как нить А может опубликовать сообщение в нити Б.

В 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.

0

Решение

В качестве общего совета, вы должны взять другую тактику для ваших усилий по переносу. Не пытайтесь «транслитерировать» стратегии кодирования Win32 на стратегии Mac. Обновите свой дизайн для методов кодирования Mac с нуля.

Во всяком случае, есть разные способы добиться чего-то похожего. Вероятно, самое простое требует, чтобы поток B использовал NSRunLoop скорее, чем CFRunLoop, Тогда поток А может использовать -[NSObject performSelector:onThread:withObject:waitUntilDone:] запустить метод в потоке B.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector