Я портирую приложение на 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.
В качестве общего совета, вы должны взять другую тактику для ваших усилий по переносу. Не пытайтесь «транслитерировать» стратегии кодирования Win32 на стратегии Mac. Обновите свой дизайн для методов кодирования Mac с нуля.
Во всяком случае, есть разные способы добиться чего-то похожего. Вероятно, самое простое требует, чтобы поток B использовал NSRunLoop
скорее, чем CFRunLoop
, Тогда поток А может использовать -[NSObject performSelector:onThread:withObject:waitUntilDone:]
запустить метод в потоке B.
Других решений пока нет …