![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Ситуация такова. Есть цикл в потоке, который ждёт и обрабатывает сообщения посланные ему.
Всё до поры работает нормально, однако когда происходит определённая нагрузка на процессор, то приём сообщений внезапно прекращается. Т.е. я вижу что поток жив, но GetMessage просто висит и ждёт сообщений, в то время как я их даже искусственно посылаю этому потоку через PostThreadMessage и результат - истина, а GetMessage тихо и спокойно ждёт. Вот функция потока:
Есть догадки о том - при определённой нагрузке проца, нечто непонятное творится с очередью этого потока. Или может что-то ещё? Вообщем вопрос, почему так? Характеристики "машины" где такое наблюдается. Celeron 2,53 GHz 223 Mb RAM OS: Windows 2000 --------------------
Бери от жизни всё. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
ты уверен что оно на GetMessage подвисает?
еще момент: надо не просто проверять на ненулевость код возврата GetMessage, но и на ошибку(-1), так как в этом случае ты мусор обрабатываешь. |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Вполне уверен. Отладчик в этом помогает делая останов на вариантах. на скока мне известно, даже если и функция вернёт -1, то он этот результат вернёт и прекратит дожидаться. А здесь она висит и всё. Как будто очередь сообщений пуста. Притом это заметно и невооружённым глазом, т.к. при нормальной работе приходят сообщения раз в 200 милисекунд. Это сообщение отредактировал(а) Lexicss - 28.9.2007, 11:31 --------------------
Бери от жизни всё. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
отладчик, кстати, помимо помощи в таком деле может и свинью подкладывать. лучше лог в файл сделай на время отладки.
попробуй использовать WaitMessage, GetQueueStatus... |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Хорошо, как мне тогда можно проверить эту ситуацию? GetMessage ведь выдаёт булевое значение, и соответсвенно при попытке сравнить её с -1 компилтор выдаёт ошибку Incompatible types. --------------------
Бери от жизни всё. |
|||
|
||||
| Alix |
|
||||||||||||
|
L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 7 Всего: 23 |
Из MSDN:
Особо обращаю внимание на то, что тип BOOL описан как LongBool поэтому integer(bool(-1)) вернет -1. А если так сделать применительно к типу boolean, то результат может быть 1, 127 и 255, в зависимости от того как использовать. PS: чтобы не быть голословным:
Это сообщение отредактировал(а) Alix - 28.9.2007, 15:01 -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
||||||||||||
|
|||||||||||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Спасиб за инфу.
Однако всё ж проблема остаётся в силе. -1 не появляется, а GetQueueStatus ничем не помогает. Что же всё-таки это может быть(по видимому, тут что-то на уровне системы с формированием очереди). Есть ещё один инетерсный аспект: в другой системе(Win 98) эта же операция работала нормально и при загрузке процессора. --------------------
Бери от жизни всё. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Похоже не неправильную работу с потоками. Т.е. не отработаны все исходы. Например при особых условиях возникает какой-нибудь дедлок. Например если нужно захватить 2 ресурса одновременно и это пытаются сделать 2 потока, каждый успел взять только по одному и ждет пока освободиться другой. Вероятность низкая, но меняется в зависимости от внешних условий.
Добавлено через 6 минут и 20 секунд Например строка TPack(AMessage.lParam).SendRecvPack; Видно, что lParam - содержит адрес объекта чужего потока, при этом доступ к общим данным никак не синхронизируется, это легко может повлечь самые разные последствия. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |