![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дополнительный поток и Exception в главном. Что будет?
Kolan © (2006-10-15 22:43:00)Здравствуйте,
В программе есть доп поток. Что будет с доп. потоком если в гл. потоке произойдетException?
Сергей М. (2006-10-16 10:30:00) [41]
> Kolan © (16.10.06 10:16) [90]
> Нет
Тогда зачем асинхронный режим задействован ?
Percent (2006-10-16 10:27:00) [42]Че он будет молотить в пустую?
Предлагаешь выключить компьютер? :-)
Поставь Sleep(50), и не мучайся...
Kolan (2006-10-16 10:16:00) [43]
> У тебя что, доп.поток еще чем-то занимается, кроме как работой
> с портом ?
Нет
> Очень трудно разобраться с приведенными фрагментами кода,
> и я не знаю, что такое ReadIndex и WriteIndex, однако,
> думаю, удобнее реализовать таким образом:
У меня там циклический буффер. Соотв индек по которому пишу данные и индекс по которому читаю и ищу начало/конец пакета.
> Sleep(0);
Гы :) Было и такое решение. Ну а зачем? А если данные часами не прийдут? Че он будет молотить в пустую?
Rem (2006-10-16 09:25:00) [44]У меня поток сам себя усыпляет:
while not Terminated do
begin
if ReadIndex >= WriteIndex then
begin
Suspend;
Очень трудно разобраться с приведенными фрагментами кода, и я не знаю, что такое ReadIndex и WriteIndex, однако, думаю, удобнее реализовать таким образом:
while not Terminated do
begin
while not Terminated and (ReadIndex >= WriteIndex) do
Sleep(0); // 10, 20 или другая цифра по условию задачи
{...}
end;
То есть, усыплять поток не надо будет...
Сергей М. (2006-10-16 08:48:00) [45]
> Kolan © (16.10.06 08:30) [87]
> у меня асинхронная работа и в потоке
И зачем там нужна асинхронность ?
У тебя что, доп.поток еще чем-то занимается, кроме как работой с портом ?
Kolan (2006-10-16 08:30:00) [46]
> Ну а в Дельфи оьрати внимание на параметр FILE_FLAG_OVERLAPPED
> и на
Этим и пользуюсь. Те у меня асинхронная работа и в потоке :)
Германн (2006-10-16 01:59:00) [47]
> Kolan © (16.10.06 01:37) [82]
>
>
> > В программе, где идёт работа с портом возникло исключение.
>
>
> До сегодняшнего дня у меня небыло исключений. в окрестности
> порта. Ошибочки обрабатывал с пом. Enumeration.. Вот решил
> за исключения взяться.
>
> А работа с портом в потоке - это из нета. А как еще чтобы
> не висло?
>
Дык, исторически микросхема UART представляла максимум возможностей для асинхронной работы с ней. Драйверы СОМ-порта в Windows умеют использовать эти возможности.
Ну а в Дельфи оьрати внимание на параметр FILE_FLAG_OVERLAPPED и на
Kolan (2006-10-16 01:53:00) [48]
> А вот resume нужен извне.
Да это извне ессно.
При добавлении новых данных делается Resume. Все же тут разницы нет наверно. Что Resume что SetEvent...
> Ex
Надо посмотреть
> Да вот сюда я и попадаю со своим исключением.
Ни че не пойму с этими исключениями...
Если:
try
SeparateHeaderAndUserDtaArrays(Package, Header, UserData);
except
Result.Free;
//raise;
end;
Это же исключение обработано? Так?
Так че оно в
except
Thread.FFatalException := AcquireExceptionObject;
поподает?
Kolan (2006-10-16 01:41:00) [49]Да вот сюда я и попадаю со своим исключением.
{$IFDEF LINUX}
if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF}
try
if not Thread.Terminated then
try
Thread.Execute;
except
Thread.FFatalException := AcquireExceptionObject;
end;
Отсюда и неверный дискриптор...
Leonid Troyanovsky (2006-10-16 01:41:00) [50]
> Kolan © (16.10.06 01:34) [81]
> У меня поток сам себя усыпляет:
Усыпиться-то он может. А вот resume нужен извне.
> WaitForSingleObject(Event, INFINITE); - не так? Нужен
> именно Ex? - С этой ф-цие не работал... :(
Ну, у молодых все еще спереди :)
Вкл., возможно, ReadFileEx & etc.
--
Regards, LVT.
Kolan (2006-10-16 01:37:00) [51]
> В программе, где идёт работа с портом возникло исключение.
До сегодняшнего дня у меня небыло исключений. в окрестности порта. Ошибочки обрабатывал с пом. Enumeration.. Вот решил за исключения взяться.
А работа с портом в потоке - это из нета. А как еще чтобы не висло?
Kolan (2006-10-16 01:34:00) [52]
> Не совсем. Т.е., Resume должен делать первичный поток.
Даааа... а в справке тока:Pauses a running thread.
У меня поток сам себя усыпляет:
while not Terminated do
begin
if ReadIndex >= WriteIndex then
begin
Suspend;
//****
> Если это еще и Ex - то и, например, по получению QueueUserAPC.
QueueUserAPCДа, это я еще...
Я понял что вместо Suspend надо сделать
WaitForSingleObject(Event, INFINITE);- не так? Нужен именно Ex? - С этой ф-цие не работал... :(
Германн (2006-10-16 01:31:00) [53]
> Kolan © (16.10.06 01:06) [70]
>
>
> > Возможно даже, что у тебя никогда проблемм и не будет,
> а
> > будут они у пользователей!
> >
>
> А какие. Пусть у меня перед сном вообще моск прокиснет и
> я как Гоголь возьму и сотру эти модули, которые писал и
> доробатывал 1,5 года :)
>
Ну вот давеча наблюдали всем техотделом такую ситуацию. В программе, где идёт работа с портом возникло исключение. Программа сдохла, но перезапустить её не было никакой возможности. Даже на CAD система не реагировала! :-)
Rem (2006-10-16 01:30:00) [54]Зря ты не регистрируешься.
Да я уже давно, как бы... :-)
Ну, а куда деваются исключения нынче надо посмотреть.
function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
try
if not Thread.Terminated then
try
Thread.Execute;
except
Thread.FFatalException := AcquireExceptionObject;
end;
finally
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.FFinished := True;
Thread.DoTerminate;
if FreeThread then Thread.Free;
EndThread(Result);
end;
end;
(C) Delphi 6
Вот туда (FFatalException) они и "паркуются". То есть, это даже не ОС завершает поток, а он сам...
Leonid Troyanovsky (2006-10-16 01:26:00) [55]
> Kolan © (16.10.06 01:15) [75]
> А это не аналог? Думал разницы нет.... что так что так..
Не совсем. Т.е., Resume должен делать первичный поток.
А вывод из Wait.. - по освобождению ожидаемого.
Если это еще и Ex - то и, например, по получению QueueUserAPC.
--
Regards, LVT.
Kolan (2006-10-16 01:25:00) [56]
> А может утечки были из-за того, с чем работал поток?
> Т.е., не мог он нормально (при Terminated) завершиться?
>
Утечки были потому, что деструктор потока не вызывался.
Ну если он спит (Не важно как Suspended или ждет Event) иTerminated := True, как же он(поток) его(Terminated) проверит - никак.... Вот я такое и навоял :)
Leonid Troyanovsky (2006-10-16 01:21:00) [57]
> Kolan © (16.10.06 01:13) [74]
> Хоть потоки и удаляются при закрытии приложения, но все
А может утечки были из-за того, с чем работал поток?
Т.е., не мог он нормально (при Terminated) завершиться?
--
Regards, LVT.
Kolan (2006-10-16 01:15:00) [58]
> Дык, пусть спит на WaitFor..(Ex), instead suspend.
А это не аналог? Думал разницы нет.... что так что так...
Kolan (2006-10-16 01:13:00) [59]
> Sleep(10); - типа, ожидание самоубийства потока?
Точно. Ну а как? Раньше просто делал Terminate и были утечки. Хоть потоки и удаляются при закрытии приложения, но все же...
PS
Чувствую себя примерно так: Пошел к зубному на обычный осмотр, оказалось через 2 дня помру, потому что тут ППЦ тут жо..а, тут вообще лечению не поддается...
Leonid Troyanovsky (2006-10-16 01:11:00) [60]
> Kolan © (16.10.06 01:03) [67]
> Если все вновь прибывшее просмотрел и пакет не нашел - засыпает.
Дык, пусть спит на WaitFor..(Ex), instead suspend.
--
Regards, LVT.