|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.11.2011, 01:39 | #1 |
Форумчанин
Регистрация: 08.11.2009
Сообщений: 225
|
Странные исключения
Есть таймер который вызывает следующую процедуру раз в 100мс
Код:
При работе около минуты, иногда раньше, вылезают исключения (рандомно) двух типов: Project Project2.exe raised exception class EOutOfResources with message 'Неверный дескриптор. '. Process stopped. Use Step or Run to continue. Project Project2.exe raised exception class EInvalidOperation with message 'Canvas does not allow drawing'. Process stopped. Use Step or Run to continue. На строчку не указывают. Пробовал добавлять проверку в таймер по переменной (в функцию showa3 добавлял в старт и в конец изменения переменной, а при тике таймера проверял ее значение, т.е. выполнилось ли предыдущее действие). Пробовал потоки юзать, хотя они здесь, по сути не нужны, и ошибок стало еще больше =\ Читаем правила раздела. Там подробно написано, как следует оформлять код и что получается, если этого не делать. Последний раз редактировалось Pamparam; 09.11.2011 в 02:08. |
09.11.2011, 01:57 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
09.11.2011, 02:03 | #3 | ||
Форумчанин
Регистрация: 08.11.2009
Сообщений: 225
|
Цитата:
Цитата:
Последний раз редактировалось Pamparam; 09.11.2011 в 14:51. |
||
09.11.2011, 02:12 | #4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
походу, таймер у вас через потоки реализован
либо где-то ещё другой поток работает с GetDC(0)
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
09.11.2011, 08:55 | #5 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
veniside, +1
либо процедура в обработке таймера НЕ УСПЕВАЕТ завершиться до того, как опять происходит вызов процедуры таймера. от этого очень легко защититься с помощью дополнительной глобальной переменной. например. Код:
|
09.11.2011, 14:47 | #6 | |||
Форумчанин
Регистрация: 08.11.2009
Сообщений: 225
|
Цитата:
Цитата:
Цитата:
Последний раз редактировалось mihali4; 09.11.2011 в 17:22. |
|||
09.11.2011, 18:38 | #7 |
Форумчанин
Регистрация: 08.11.2009
Сообщений: 225
|
Попробуем немного по-другому
Код:
Опять же упростил, но исключение вылазит. Работает несколько минут или меньше и прерывается именно на строке, которая выделена. Будь там Код:
Вообщем у меня почему-то кушало память, т.е., как будто, ReleaseDC(0,dc); не работал. Полазил по нету и нашел аналогичную проблему, где была та же ошибка и ело память (поэтому проверил свою прогу на утечку), там все решилось правильными значениями в ReleaseDC. Но т.к. у меня releaseDC должно работать правильно пересмотрел подробнее пример. Там ТС использовал не глобальную переменную (для проверки выполнения в таймере), а остановку и запуск таймера в самом таймере, т.е.: Код:
Хз почему с переменной возникали проблемы, т.к. использовал данную процедуру в чистой форме (наверное значения неправильно синхронизировались в потоках таймера или т.п.). такие вот пироги. Последний раз редактировалось mihali4; 10.11.2011 в 19:50. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
странные таблички | Пепел Феникса | Свободное общение | 5 | 22.09.2010 14:13 |
странные проблемы с с++ | Plastilin | Общие вопросы C/C++ | 9 | 21.02.2010 03:50 |
Странные ошибки. | Rio309 | Общие вопросы Delphi | 2 | 19.10.2009 19:22 |
Странные окна в ХР. | Танатис | Windows | 3 | 03.07.2009 14:13 |