2013-07-05 2 views
0

Я портирование приложения на Mac OS X.PostThreadMessage эквивалент на Mac OS X

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

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

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

В Windows это возможно PostThreadMessage. Для этого не может быть прямого порта для Mac OS X, но должен быть способ сделать это на Mac OS X.

Обратите внимание, что поток B не знает о потоке A, но поток A знает поток B.

Окна код:

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

Что не так с любым старым классом коллекции и некоторой блокировкой потока? – trojanfoe

+0

Я довольно новичок в Mac OS X. Я не знаю, как добиться этого на Mac OS X. Я просто хочу эквивалентную функциональность в Mac OS X. Если возможно использование блокировки потоков, отправьте пример. – doptimusprime

+0

Чтобы сделать его более понятным, я добавил пример кода. – doptimusprime

ответ

1

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

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

+0

Я не поддерживаю объект NSThread. Резьба A имеет только идентификатор Thread B. Пожалуйста, предоставьте решение в CFRunLoop или используйте потоки Posix (например, замки). Даже если для этого требуется реализовать собственный источник цикла запуска, я могу это сделать. – doptimusprime

+1

Почти ничего не интересного, которое вы можете сделать только с идентификатором потока. Почему вы настаиваете на том, что у вас может быть только идентификатор потока, если это не соответствует потребностям вашей программы? Любое решение, использующее блокировки или собственный источник цикла запуска, по-прежнему требует, чтобы вы поддерживали ссылку на некоторую общую структуру данных. Как только вы примете это требование, ваша общая структура данных также может быть указателем 'NSThread'. Метод, который я предложил, безусловно, реализуется под капотом как источник цикла запуска или какой-то таймер. Зачем переустанавливать то, что уже предусмотрено? –