Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дополнительный поток и Exception в главном. Что будет?


Страницы:   1 2 3 4 5 6 7

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.


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо