while (::GetMessage(&msg, NULL,0,0)) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

while (::GetMessage(&msg, NULL,0,0))

Поиск

MSG msg;

while (::GetMessage(&msg, NULL,0,0))

{

    ::TranslateMessage(&msg);

    ::DispatchMessage(&msg);

}

 

В «жадную» функцию можно вставить обработку сообщений, добавив в ее основной цикл следующий код:

 

MSG msg;

if (::PeekMessage(&msg, NULL,0,0,PM_REMOVE))

{

    ::TranslateMessage(&msg);

    ::DispatchMessage(&msg);

}

 

Функция PeekMessage работает так же как и GetMessage, но возвращает управление немедленно, даже если для программы нет сообщений.

 

2 способ: проверка рабочим потоком значения глобальной переменной, которая может быть изменена основным потоком.

 

Для надежного взаимодействия потоков следует синхронизировать доступ потоков к общим данным или обеспечить обмен сообщениями (последнее в нашем случае возможно только в одну сторону: от рабочего потока к главному).

 

Почему это важно? Представьте, что ваша программа отслеживает показания времени как часы и минуты и каждое из этих значений хранится в отдельной переменной. И пусть поток А, который изменяет значение времени каждую минуту, был прерван потоком Б ровно в 10 часов, после обновления счетчика часов, но до обновления минут. В результате поток Б получит значение времени, превышающее истинное примерно на 1 час.

 

Для синхронизации потоков в Win32 предусмотрен целый ряд средств, которые инкапсулируются в MFC в классах CSyncObject, CSemaphore, CMutex, CEvent и CCriticalSection. Последний из них нам понадобится, когда мы займемся интерфейсом для решателя задачи выпуклого программирования (позднее). Однако для организации взаимодействия потока оконного интерфейса и решателя задачи нам достаточно переключить (и затем проверить) однобитовый флаг, поэтому мы обойдемся более простыми встроенными средствами языка C. 

 

Ключевое слово volatile используется для объявления о том, что объект может изменяться не только по предписаниям данного потока, но и операционной системой, аппаратными средствами или параллельно выполняющимися потоками. Пример его использования:

 

int volatile nVolatile;

 



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 53; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.007 с.)