![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Unregistered |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.6.2004 Репутация: нет Всего: нет |
Программа в отдельном потоке опрашивает устройство через ком-порт. Опрос идет непрерывно, круглосуточно. Если в обмене происходит какой-то сбой, то поток убивается и создается по новой. Отработала прога уже больше полугода и вот какая проблема случилась: в одно прекрасное утро обмен прекратился. Прога выдала ошибку "Thread creation error. Подсоединенное к системе устройство не работает". После перезагрузки системы все опять заработало. В проге не стоит проверка на корректность создания потока, отсюда и ошибка вылетает-это понятно. Непонятны причины по которым система не может создать поток. Может кто-нибудь объяснить? Спасибо.
|
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
для этого желательно бы код посмотреть его содзадия или самому написать обработчик ошибок примерно следующего содержания:
Если это была системная ошибка, а не генерируемая Дельфийским наследником Exception. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
А какая система?
Слышал (сам не проверял), что Win9x при создании+уничтожении потока безвозвратно теряет часть системных ресурсов. Причем, в источнике информации было даже сказанно сколько и каких, но к сожалению, не помню где он этот источник. Если это так, то при очень длительной работе системы без перезагрузки, если какой-либо из процессов периодически создает и удаляет потоки, то однажды это ему не удасться У тебя очень похоже на это. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
насколько я слышал
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Unregistered |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.6.2004 Репутация: нет Всего: нет |
На 98-ю это очень похоже, но мы специально для этой программы выделили машину под w2kprof.
Хотя никто не исключал и там такие-же косяки. :( Код создания прост до безобразия: constructor TCommThread.Create(CommPort:THandle;const Request:array of byte;RequestSize:DWORD); var i:integer; begin inherited Create(true); AbnormalTerminate:=0; UserCancel:=false; CommHandle:=CommPort; SetCommMask(CommHandle,EV_RXCHAR); OVRL.Internal:=0; OVRL.InternalHigh:=0; OVRL.Offset:=0; OVRL.OffsetHigh:=0; OVRL.hEvent:=CreateEvent(nil,false,false,nil);//overlapp для WaitCommEvent SetLength(arrRequest,RequestSize); For i:=0 to RequestSize-1 do arrRequest[i]:=Request[i]; WriteLog('Start at '+DateTimeToStr(Now)); Resume; end; OVRL - структура TOverlapped объявленная глобально. С ней работает только один экземпляр потока TCommThread. Обработчик я написал по совету Spawn-а, но, блин, еще пол-года ждать? :) И я еще забыл добавить, что програмка-то не в единственном экземпляре работает. Их запущено несколько штук , каждая со своим ком-портом. вот они-то пахали без проблем, и одна из них глюкнула, остальные продолжали работать. |
|||
|
||||
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Может остальные в этот момент просто не пыталсь пересоздать поток?
А при уничтожении потока (в Destroy) ты не забываешь сделать CloseHandle для OVRL.hEvent ? И еще, arrRequest где объявлена ? -------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
блин я ж про это и писал:
__fastcall TThread(bool CreateSuspended); поэтому должно быть inherited Create(false); ( это при условии что поток у тебя никто специально не запускает ( я этот кусок не увидел ) и твой TCommThread -- наследник TThread' a ( этого я тоже не увидел ) ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Как это не увидел? А как ты думаешь, что делает Resume в конце приведенного примера? -------------------- Все знать невозможно, но хочется |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
мда... не заметил
а разве функция не должна вызываться так: Resume()? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Нет, в Delphi (Pascal) при вызове процедуры (функции) без параметров указывать '()' не обязательно. Хотя, с ними нагляднее, и я последнее время стараюсь их писать.
-------------------- Все знать невозможно, но хочется |
|||
|
||||
| Unregistered |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.6.2004 Репутация: нет Всего: нет |
Да, да hunter, внимательнее.
Петрович, closehandle делаю. в свое время я уже сталкивался с проблемой незакрытых хендлов. А arrRequest динамический массив объявленный внутри класса TCommThread в секции Private. В проге реализована возможность создавать и уничтожать потоки вручную (опрашивать/неопрашивать устройство). так я специально несколько раз останавливал и запускал - все нормально. |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
В принципе, попробуй проверить программу на утечку памяти. Если ее нет, то даже и не заню что еще сказать -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Girder |
|
||||||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
Добавь FreeOnTerminate:=true, т.е:
Реализация Execute:
Удачи. Это сообщение отредактировал(а) Girder - 8.7.2004, 13:45 -------------------- Как слышим, так и пишим. Истина где-то там... |
||||||||
|
|||||||||
| Unregistered |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.6.2004 Репутация: нет Всего: нет |
Спасибо. Буду смотреть... если снова вылетит
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Попробуй выяснить что именно у тебя утекает (если утекает) - жми ctrl+alt+del, view->select columns и поставь галку handle count, может еще какие поставь - и смотри какие со временем будут быстро расти...
Если handle count растёт, то есть спец. проги (Process Explorer), там можно глянуть все открытые объекты в проге, а тут уж понятно станет что у тебя утекает... И потом совет: лучше не убивай поток, а делай Suspend, а когда надо будет его пересоздать, делай Resume, но перед этим заново проделай инициализацию (то что в Create стоит) - так утечка хэндлов потоков уберется (а она есть, т.к. при уничтожении потока всё равно остается остаточная инфа (например, время уничтожения, время работы потока) до тех пор, пока не уничтожится процесс)... Не знаю, часто ли у тебя случаются сбои, и сколько в итоге за полгода накапливается этих мусорных потоков... Вполне возможно, что винда при нехватке ресурсов уничтожает этот мусор, но кто её знает... Это сообщение отредактировал(а) p0s0l - 9.7.2004, 14:49 -------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "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. |