Нащупал точку проблемы. Похоже я неправильно использую средства оси. Или это такая особенность.
Есть некая очередь сообщений. По некоему сообщению проваливаемся в обработчик, и там в одном месте есть ожидание флага. Теперь пока мы ждем флага в очередь сообщений приходит новое. И система воспринимает это, как событие, по которому пора разбудить процесс. Более внимательно посмотрел в отладчике. После вынимания из очереди очередного элемента не чистится флаг в ConsumersProcessMap. Соответственно приход нового элемента будит процесс и Wait у Event проваливается сразу. Это баг или так и должно быть и сам подход использования неверен?
Код
if (SystemMsg.pop(sysmsg,100))
{
switch(sysmsg.msg)
{
case KEY_PRESSED:
{
// перешли в новое
// здесь ожидаем некоего флага
Rquest_done.Wait(5000);
}break;
...
}//switch
} else {
// делать что-то
}
Вот еще один момент. Такое проявляется при приходе сообщения (push элемента chanal) из более высокоприоритетного потока. В момент проверки ожидающих потоков, стоит бит, что он ready (вполне возможно просто прерван верхним потоком) и при этом ConsumersProcessMap указывает, что этот самый готовый поток ждет сообщения. Чудеса. Из менее приоритетного ConsumersProcessMap обнуляется, там таких странных вещей не наблюдается. Пробовал поймать, где застревает флаг ожидания. Не получается.
Сообщение отредактировал BAT - Mar 9 2011, 17:13