logo search
Литература_1 / photon_old

Потоки реального времени

Не создавайте вызовов Photon'овских функций в потоках, которые должны иметь детерминированное поведение, удовлетворяющее требованиям реального времени. Сложно прогнозировать, как долго будет продолжаться блокирование на PtEnter(); это может забрать время у потока, который владеет замком для завершения обработки текущего события или вызова PtLeave(), особенно если это касается отсылки сообщения другим процессам (таким как менеджер окон).

Лучше иметь "рабочий поток", удовлетворяющий требованиям к Вашим потокам реального времени, и исполнять этот поток в его собственной секции входа/выхода. Переменная состояния – и, возможно, очередь запросов – является хорошим способом отсылки этих запросов между потоками.

Если Вы используете рабочие потоки, и Вам надо использовать переменную состояния, вызовите вместо функции pthread_cond_wait() функцию PtCondWait() и отделите мутекс. Функция PtCondWait() использует замок библиотеки Photon'а как мутекс и исполняет безусловный вызов PtLeave(), когда Вы блокируетесь, и PtEnter() – когда разблокируетесь.

Потоки блокированы до тех пор, пока:

Функция PtCondTimedWait() похожа на PtCondWait(), но время блокирования ограничено тайм-аутом.

      1. Не-Photon'овские и Photon'овские потоки

Библиотека отслеживает, какие из Ваших потоков являются Photon'овскими (читающими сообщения), а какие – не-Photon'овскими (нечитающими). Таким образом, библиотека всегда знает, сколько Ваших потоков способно получать и обрабатывать события. Эта информация в настоящее время используется только функцией PtModaBlock() (см. раздел "Модальные операции и потоки" ниже).

По умолчанию, поток, вызвавший функцию PtInit(), является читателем событий, а все остальные – нет. Но если нечитающий поток вызывает функцию PtProcessEvent() или PtMainLoop(), он автоматически становится читающим события.

 Photon не запускает новых потоков для Вас, если Вы завершили Photon'овские потоки.Вы также можете превратить нечитающий поток в читающий и обратно, передавая флаг в функцию PtEnter() или PtLeave():

Pt_EVENT_PROCESS_ALLOW

Превратить вызывающий поток в читающий события

PtEVENT_PROCESS_PREVENT

Превратить вызывающий поток в нечитающий.

Если Вам не требуется изменять состояние потока (например, для не-Photon'овского потока, который никогда не обрабатывает никаких событий), не устанавливайте ни тот, ни другой из этих битов во флагах.

Если Вы вызываете функцию Pt_Leave() в ответной реакции, потому что собираетесь выполнить что-то достаточное длительное по времени, передайте функции PtLeave() признак Pt_EVENT_PROCESS_PREVENT. Это укажет библиотеке, что данный поток не собирается обрабатывать событие довольно значительный промежуток времени. Убедитесь, что передали Pt_EVENT_PROCESS_ALLOW функции PtEnter(), перед тем как выполнить возврат из ответной реакции.