Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread creation error, Из-за чего возникает?? 
:(
    Опции темы
Unregistered
Дата 6.7.2004, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2004

Репутация: нет
Всего: нет



Программа в отдельном потоке опрашивает устройство через ком-порт. Опрос идет непрерывно, круглосуточно. Если в обмене происходит какой-то сбой, то поток убивается и создается по новой. Отработала прога уже больше полугода и вот какая проблема случилась: в одно прекрасное утро обмен прекратился. Прога выдала ошибку "Thread creation error. Подсоединенное к системе устройство не работает". После перезагрузки системы все опять заработало. В проге не стоит проверка на корректность создания потока, отсюда и ошибка вылетает-это понятно. Непонятны причины по которым система не может создать поток. Может кто-нибудь объяснить? Спасибо.
PM MAIL   Вверх
<Spawn>
Дата 6.7.2004, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



для этого желательно бы код посмотреть его содзадия или самому написать обработчик ошибок примерно следующего содержания:

Код
ShowMessage(SysErrorMessage(GetLastError))


Если это была системная ошибка, а не генерируемая Дельфийским наследником Exception.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Петрович
Дата 6.7.2004, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



А какая система?
Слышал (сам не проверял), что Win9x при создании+уничтожении потока безвозвратно теряет часть системных ресурсов. Причем, в источнике информации было даже сказанно сколько и каких, но к сожалению, не помню где он этот источник.
Если это так, то при очень длительной работе системы без перезагрузки, если какой-либо из процессов периодически создает и удаляет потоки, то однажды это ему не удасться sad.gif. И поможет только перезагрузка OS.
У тебя очень похоже на это.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
_hunter
Дата 6.7.2004, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



насколько я слышал smile.gif ресурсы теряются если поток создать спящим, а потом, не запуская, убить


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Unregistered
Дата 7.7.2004, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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-а, но, блин, еще пол-года ждать? :)

И я еще забыл добавить, что програмка-то не в единственном экземпляре работает. Их запущено несколько штук , каждая со своим ком-портом. вот они-то пахали без проблем, и одна из них глюкнула, остальные продолжали работать.
PM MAIL   Вверх
Петрович
Дата 7.7.2004, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
одна из них глюкнула, остальные продолжали работать

Может остальные в этот момент просто не пыталсь пересоздать поток?
Цитата
Код
OVRL.hEvent:=CreateEvent(nil,false,false,nil);//overlapp для WaitCommEvent

А при уничтожении потока (в Destroy) ты не забываешь сделать CloseHandle для OVRL.hEvent ?
И еще, arrRequest где объявлена ?


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
_hunter
Дата 7.7.2004, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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...
PM ICQ   Вверх
Петрович
Дата 7.7.2004, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
это при условии что поток у тебя никто специально не запускает ( я этот кусок не увидел ) и твой TCommThread -- наследник TThread' a ( этого я тоже не увидел ) )

Как это не увидел? А как ты думаешь, что делает Resume в конце приведенного примера?



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
_hunter
Дата 7.7.2004, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



мда... не заметил sad.gif
а разве функция не должна вызываться так: Resume()?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Петрович
Дата 7.7.2004, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Нет, в Delphi (Pascal) при вызове процедуры (функции) без параметров указывать '()' не обязательно. Хотя, с ними нагляднее, и я последнее время стараюсь их писать.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Unregistered
Дата 8.7.2004, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2004

Репутация: нет
Всего: нет



Да, да hunter, внимательнее. smile.gif
Петрович, closehandle делаю. в свое время я уже сталкивался с проблемой незакрытых хендлов. А arrRequest динамический массив объявленный внутри класса TCommThread в секции Private.
В проге реализована возможность создавать и уничтожать потоки вручную (опрашивать/неопрашивать устройство). так я специально несколько раз останавливал и запускал - все нормально.
PM MAIL   Вверх
Петрович
Дата 8.7.2004, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
В проге реализована возможность создавать и уничтожать потоки вручную (опрашивать/неопрашивать устройство). так я специально несколько раз останавливал и запускал - все нормально.

В принципе, попробуй проверить программу на утечку памяти. Если ее нет, то даже и не заню что еще сказать sad.gif


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Girder
Дата 8.7.2004, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Добавь FreeOnTerminate:=true, т.е:
Код
FreeOnTerminate:=true;
Resume;
end;
тогда при выходе из Execute(добавь на выходе arrRequest:=nil ну и т.п.) экземпляр класса автоматически освобождается.

Реализация Execute:
Код
procedure TCommThread.Execute;
begin
while not(Terminated) do
 begin
 ....
 end;
arrRequest:=nil;
....
end;
Тогда для удаления экземпляра:
Код
try
XXX.Terminate;
except
end;


Цитата
...программу на утечку памяти
Да похоже. У меня в одной проге от 1 до несколько тысяч запускается(и удаляются) потоков и ни когда таких проблемм не было.

Удачи.

Это сообщение отредактировал(а) Girder - 8.7.2004, 13:45


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Unregistered
Дата 9.7.2004, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2004

Репутация: нет
Всего: нет



Спасибо. Буду смотреть... если снова вылетит wink.gif
PM MAIL   Вверх
p0s0l
Дата 9.7.2004, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 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


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.