| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Очередь в потоке |
| Автор: Lexicss 28.9.2007, 11:00 | ||
| Ситуация такова. Есть цикл в потоке, который ждёт и обрабатывает сообщения посланные ему. Всё до поры работает нормально, однако когда происходит определённая нагрузка на процессор, то приём сообщений внезапно прекращается. Т.е. я вижу что поток жив, но GetMessage просто висит и ждёт сообщений, в то время как я их даже искусственно посылаю этому потоку через PostThreadMessage и результат - истина, а GetMessage тихо и спокойно ждёт. Вот функция потока:
Есть догадки о том - при определённой нагрузке проца, нечто непонятное творится с очередью этого потока. Или может что-то ещё? Вообщем вопрос, почему так? Характеристики "машины" где такое наблюдается. Celeron 2,53 GHz 223 Mb RAM OS: Windows 2000 |
| Автор: dumb 28.9.2007, 11:10 |
| ты уверен что оно на GetMessage подвисает? еще момент: надо не просто проверять на ненулевость код возврата GetMessage, но и на ошибку(-1), так как в этом случае ты мусор обрабатываешь. |
| Автор: Lexicss 28.9.2007, 11:29 | ||
Вполне уверен. Отладчик в этом помогает делая останов на вариантах. на скока мне известно, даже если и функция вернёт -1, то он этот результат вернёт и прекратит дожидаться. А здесь она висит и всё. Как будто очередь сообщений пуста. Притом это заметно и невооружённым глазом, т.к. при нормальной работе приходят сообщения раз в 200 милисекунд. |
| Автор: Lexicss 28.9.2007, 14:42 | ||
Хорошо, как мне тогда можно проверить эту ситуацию? GetMessage ведь выдаёт булевое значение, и соответсвенно при попытке сравнить её с -1 компилтор выдаёт ошибку Incompatible types. |
| Автор: Alix 28.9.2007, 14:57 | ||||||||||||
Из MSDN:
Особо обращаю внимание на то, что тип BOOL описан как LongBool поэтому integer(bool(-1)) вернет -1. А если так сделать применительно к типу boolean, то результат может быть 1, 127 и 255, в зависимости от того как использовать. PS: чтобы не быть голословным:
|
| Автор: Lexicss 28.9.2007, 16:30 |
| Спасиб за инфу. Однако всё ж проблема остаётся в силе. -1 не появляется, а GetQueueStatus ничем не помогает. Что же всё-таки это может быть(по видимому, тут что-то на уровне системы с формированием очереди). Есть ещё один инетерсный аспект: в другой системе(Win 98) эта же операция работала нормально и при загрузке процессора. |
| Автор: Alexeis 28.9.2007, 16:49 |
| Похоже не неправильную работу с потоками. Т.е. не отработаны все исходы. Например при особых условиях возникает какой-нибудь дедлок. Например если нужно захватить 2 ресурса одновременно и это пытаются сделать 2 потока, каждый успел взять только по одному и ждет пока освободиться другой. Вероятность низкая, но меняется в зависимости от внешних условий. Добавлено через 6 минут и 20 секунд Например строка TPack(AMessage.lParam).SendRecvPack; Видно, что lParam - содержит адрес объекта чужего потока, при этом доступ к общим данным никак не синхронизируется, это легко может повлечь самые разные последствия. |