Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

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

 
Leonid Troyanovsky ©   (2006-10-16 00:03) [40]


> Percent   (15.10.06 23:58) [38]


Зря ты не регистрируешься.

Ну, ладно, иду спать.

--
Regards, LVT.


 
Kolan ©   (2006-10-16 00:03) [41]


> Ему и показывать-то ничего не надо, оказывается... "Показать
> сообщение - не цель" (С) Kolan

Да не цель, я по исключению что-то сделаю, отреагирую так сказать.
Сейчас показываю для отладки.


 
Leonid Troyanovsky ©   (2006-10-16 00:07) [42]


> Kolan ©   (16.10.06 00:03) [41]

> Сейчас показываю для отладки.


Показывать же надо через Synchronize.

--
Regards, LVT.


 
Kolan ©   (2006-10-16 00:10) [43]


> Показывать же надо через Synchronize.

Ни че не пойму. В потоке исключения не возникают. Они возникают в методе, вызванном через Synchronize. Те так как вы говорите, а это приводит к [17]


 
Ketmar ©   (2006-10-16 00:12) [44]

>[43] Kolan(c) 16-Oct-2006, 00:10
ну почитай ты генофонд, а? %-)


 
Leonid Troyanovsky ©   (2006-10-16 00:17) [45]


> Kolan ©   (16.10.06 00:10) [43]

> > Показывать же надо через Synchronize.

> Ни че не пойму. В потоке исключения не возникают. Они возникают
> в методе, вызванном через Synchronize.

Ну, если они не обрабатываются в том самом методе,
то должны быть обработаны в потоке, вызвавшем Synchronize.
Однако, если в этом потоке возникла нужда в к.л. показе, то оный
должен быть, опять же, в Synchronize (но, видимо, в ином).

--
Regards, LVT.


 
Kolan ©   (2006-10-16 00:19) [46]


> ну почитай ты генофонд, а? %-)

Генофонд ниасилю. А вот Тейктеру и Пачеко перечитал про Synchroonize. Ну как бы ... а что я должен был понять?


 
Ketmar ©   (2006-10-16 00:20) [47]

>[46] Kolan(c) 16-Oct-2006, 00:19
>Synchroonize. Ну как бы ... а что я должен был понять?
а я откуда знаю? %-)


 
Kolan ©   (2006-10-16 00:23) [48]


> Ну, если они не обрабатываются в том самом методе,
> то должны быть обработаны в потоке, вызвавшем Synchronize.
>

Так усвоил.

Однако, если в этом потоке возникла нужда в к.л. показе, то оный
должен быть, опять же, в Synchronize (но, видимо, в ином).

Тоже дошло.


> Ну, если они не обрабатываются в том самом методе,


Вопрос: А если обрабатываются?

Result := TPackage.Create;
 try
   SeparateHeaderAndUserDtaArrays(Package, Header, UserData);

 except
   Result.Free;
 end;


 
Kolan ©   (2006-10-16 00:25) [49]


> ну почитай ты генофонд, а? %-)

Читать могу хоть сто раз. Пока не пойму на что обратить внимание не разберусь :(.

PS
 Я знаю что я тупой. :)


 
Ketmar ©   (2006-10-16 00:31) [50]

>[49] Kolan(c) 16-Oct-2006, 00:25
>Читать могу хоть сто раз. Пока не пойму на что обратить
>внимание не разберусь :(.
тогда заучи. чтобы даже во сне отбарабанивал. озарение само придёт. %-)

зыж это я засыпаю уже. вторые сутки. или третьи? оттого и сумбур. %-)


 
Leonid Troyanovsky ©   (2006-10-16 00:32) [51]


> Kolan ©   (16.10.06 00:23) [48]

> Вопрос: А если обрабатываются?


Без re-raise?
Тогда, как обычно, как будто их вовсе нет.

--
Regards, LVT.

PS
http://groups.google.com/group/fido7.ru.delphi/msg/d9a27ed6dbccaf7f


 
Kolan ©   (2006-10-16 00:37) [52]


> оттого и сумбур. %-)

Ну тебя. Ну не могу я понять...

Почему после Synchronize(SendPackage); доп поток чего-то ждет?
Вот передал он скрытому окну сообщение CM_EXECPROC и свой метод. И сё чего еще ждать?

Почему если в SendPackage исключение - обработанное, то с доп потоком что-то случается.


 
Ketmar ©   (2006-10-16 00:40) [53]

>[52] Kolan(c) 16-Oct-2006, 00:37
ой, ну тебя. если завтра проснусь -- проверю и попробую что-то внятное сформулировать. коли до того кто не расскажет. и ежели я не забуду да не обломлюсь. %-)


 
Kolan ©   (2006-10-16 00:40) [54]


> Тогда, как обычно, как будто их вовсе нет.

Да, понятно. Окна нет будет.
Вот, с этим я разобрался.
Те. при ре райзе обработка должна быть в доп потоке. Если его нет, то в главном все заканчиватся. Так?
Но почему "Неверый дискриптор" при закрытии? Ошибка в 17 строке что-ли?


 
Kolan ©   (2006-10-16 00:44) [55]


> резюмируя: Synchronize() -- это очень быстро, и обязательно
> должно завершиться безо всяких исключений. надо обработку
> -- сохраняй где-то данные, возвращайся из SendPackage(),
>  и обрабатывай уже потом. а то у тебя не параллельная работа
> получается, а непонятно что.

Чем больше думаю ... Все таки не может быть, что доп поток ждет пока закончится метод в Synchronize. По косвенной причине точно. Иногда доп поток работает оч. интенсивно, если бы он ждал данные испортились бы...


 
Kolan ©   (2006-10-16 00:45) [56]

Ладно, завтра тему еще подниму. Так как не разобрался я нифига, еще больше запутался.


 
Ketmar ©   (2006-10-16 00:46) [57]

цитата из справки: "Execution of the thread current is suspended while Method executes in the main thread."


 
Leonid Troyanovsky ©   (2006-10-16 00:51) [58]


> Kolan ©   (16.10.06 00:44) [55]

> Чем больше думаю ... Все таки не может быть, что доп поток
> ждет пока закончится метод в Synchronize.

На то он и Synchronize, чтоб ждать, пока все не кончится
в первичном.

--
Regards, LVT.


 
Германн ©   (2006-10-16 00:52) [59]

Всё прочесть не осилил.
Но помимо одного "геморроя" (работа с внешним устройством по СОМ-порту в доппотоке), добавлен ещё и второй - "проблемы с исключениями в доппотоках".
P.S. Из анекдота всем известного - "Доктор, я буду жить? Будешь, но х#%во!"


 
Kolan ©   (2006-10-16 00:53) [60]

Так... точно есть...

А удаляю поток так:
 destructor TConnectionManager.Destroy;
begin
 FCommPort.Free;
 FCommReadThread.Terminate;
 FCommReadThread.Resume;
 FPackageComposer.Free;
 FPackageExtractor.Terminate;
 FPackageExtractor.Resume;

 Sleep(10);
inherited Destroy;
end;


При FCommReadThread.Resume; и получается "Неверный дескриптор". Вот наверно почему.

Если удаляю не так, то я не виноват :) как-то тут обсуждал как удалить спящий, не спящий поток.. Получилось так.

Ладно надо думать как переделать.

PS
 Тема не закрыта..


 
Kolan ©   (2006-10-16 00:55) [61]


> (работа с внешним устройством по СОМ-порту в доппотоке)

Это пока не трогаем - это тоже есть,  это не ток поток, и это надо в отдельную конференцию....

Кстати пока с этим проблем не возникало, те получить данные из порта - проблем нет...


 
Percent   (2006-10-16 00:57) [62]

Но почему "Неверый дискриптор" при закрытии?

При возникновении исключения в потоке, если это исключение не перехватывается программным кодом потока, происходит "аварийное" завершение потока, и поток удаляется средствами ОС как "преждевременно почивший". То есть, поток - это сущность ОС, и реальное управление им осуществляет ОС. При завершении приложения, производится обращение к потоку, уже удаленному средствами ОС. А так как потока уже реально не существует, то и дескриптор его - неверный. Типа как-то вот так. Читай внимательно про обработку исключений в потоках. То есть, я хотел сказать, что выпускать исключение из потока не следует...


 
Kolan ©   (2006-10-16 00:58) [63]


> На то он и Synchronize, чтоб ждать, пока все не кончится
> в первичном.

Вот она истина, а мне нужен такой же Synchronize(тока без крыльев), но чтобы не ждал. Те это PostMessage, но он не подходит. Очень не хочется так делать. Некрасиво если форма знает о каком-то порте... Я считаю, что она не должна.


 
Leonid Troyanovsky ©   (2006-10-16 00:58) [64]


> Kolan ©   (16.10.06 00:53) [60]

> Если удаляю не так, то я не виноват :) как-то тут обсуждал
> как удалить спящий, не спящий поток.. Получилось так.


А с чего-то он вдруг попал в suspend?
С этим, дейс-но, надо разобраться, вне зависимости от
прошлых обсуждений.

--
Regards, LVT.


 
Percent   (2006-10-16 00:59) [65]

А удаляю поток так:
destructor TConnectionManager.Destroy;
begin
FCommPort.Free;
FCommReadThread.Terminate;
FCommReadThread.Resume;
FPackageComposer.Free;
FPackageExtractor.Terminate;
FPackageExtractor.Resume;
Sleep(10);
inherited Destroy;
end;


А где здесь удаление потока?


 
Германн ©   (2006-10-16 01:01) [66]


> Kolan ©   (16.10.06 00:55) [61]
>
>
> > (работа с внешним устройством по СОМ-порту в доппотоке)
>
> Это пока не трогаем - это тоже есть,  это не ток поток,
> и это надо в отдельную конференцию....
>
> Кстати пока с этим проблем не возникало, те получить данные
> из порта - проблем нет...
>

Тут главное слово пока! Возможно даже, что у тебя никогда проблемм и не будет, а будут они у пользователей!


 
Kolan ©   (2006-10-16 01:03) [67]


> А с чего-то он вдруг попал в suspend?
> С этим, дейс-но, надо разобраться, вне зависимости от
> прошлых обсуждений.

Я его попросил. Общий смысл.
1. Прихдят данные. Надо выделить пакет(Начало и конец искать надо).
2. Но пакеты длинные и приходят частями.

Поэтому я завел поток(о нем мы и говорили все это время). Как только что-то пришло оно кладется в буффер потока и поток просыпается и начинает просматривать данные.
Если все вновь прибывшее просмотрел и пакет не нашел - засыпает. Если нашел Выдает его - это и есть Synchronize(SendPackage);.


 
Kolan ©   (2006-10-16 01:05) [68]


> Тут главное слово пока! Возможно даже, что у тебя никогда
> проблемм и не будет, а будут они у пользователей!

Тут бы с этим разобраться. Связь устраиватет. Вот будет неработатья тебя вспомню :).

> А где здесь удаление потока?

Угадай :) FreeOnTerminate := True;


 
Leonid Troyanovsky ©   (2006-10-16 01:06) [69]


> Percent   (16.10.06 00:57) [62]

> При возникновении исключения в потоке, если это исключение
> не перехватывается программным кодом потока, происходит
> "аварийное" завершение потока, и поток удаляется средствами

Начиная с D5+ обработка исключений во вторичном потоке изменилась.
Т.е., до того, необработанные исключения в потоке приводили
к завершению приложения (что и есть правильно).
Ну, а куда деваются исключения нынче надо посмотреть.
В понедельник, т.е., уже сегодня, наверное :)

--
Regards, LVT.


 
Kolan ©   (2006-10-16 01:06) [70]


> Возможно даже, что у тебя никогда проблемм и не будет, а
> будут они у пользователей!
>

А какие. Пусть у меня перед сном вообще моск прокиснет и я как Гоголь возьму и сотру эти модули, которые писал и доробатывал 1,5 года :)


 
Kolan ©   (2006-10-16 01:07) [71]


> Начиная с D5+ обработка исключений во вторичном потоке изменилась.
>  

Кстати делаю все на D2006


 
Percent   (2006-10-16 01:08) [72]

Угадай :) FreeOnTerminate := True;

Sleep(10); - типа, ожидание самоубийства потока?


 
Leonid Troyanovsky ©   (2006-10-16 01:11) [73]


> Kolan ©   (16.10.06 01:03) [67]

> Если все вновь прибывшее просмотрел и пакет не нашел - засыпает.


Дык, пусть спит на WaitFor..(Ex), instead suspend.

--
Regards, LVT.


 
Kolan ©   (2006-10-16 01:13) [74]


> Sleep(10); - типа, ожидание самоубийства потока?

Точно. Ну а как? Раньше просто делал Terminate и были утечки. Хоть потоки и удаляются при закрытии приложения, но все же...

PS
 Чувствую себя примерно так: Пошел к зубному на обычный осмотр, оказалось через 2 дня помру, потому что тут ППЦ тут жо..а, тут вообще лечению не поддается...


 
Kolan ©   (2006-10-16 01:15) [75]


> Дык, пусть спит на WaitFor..(Ex), instead suspend.

А это не аналог? Думал разницы нет.... что так что так...


 
Leonid Troyanovsky ©   (2006-10-16 01:21) [76]


> Kolan ©   (16.10.06 01:13) [74]

>  Хоть потоки и удаляются при закрытии приложения, но все


А может утечки были из-за того, с чем работал поток?
Т.е., не мог он нормально (при Terminated) завершиться?

--
Regards, LVT.


 
Kolan ©   (2006-10-16 01:25) [77]


> А может утечки были из-за того, с чем работал поток?
> Т.е., не мог он нормально (при Terminated) завершиться?
>

Утечки были потому, что деструктор потока не вызывался.

Ну если он спит (Не важно как Suspended или ждет Event) и Terminated := True , как же он(поток) его(Terminated) проверит - никак.... Вот я такое и навоял :)


 
Leonid Troyanovsky ©   (2006-10-16 01:26) [78]


> Kolan ©   (16.10.06 01:15) [75]

> А это не аналог? Думал разницы нет.... что так что так..


Не совсем. Т.е., Resume должен делать первичный поток.
А вывод из Wait.. - по освобождению ожидаемого.
Если это еще и Ex - то и, например, по получению QueueUserAPC.

--
Regards, LVT.


 
Rem ©   (2006-10-16 01:30) [79]

Зря ты не регистрируешься.

Да я уже давно, как бы... :-)

Ну, а куда деваются исключения нынче надо посмотреть.

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) они и "паркуются". То есть, это даже не ОС завершает поток, а он сам...


 
Германн ©   (2006-10-16 01:31) [80]


> Kolan ©   (16.10.06 01:06) [70]
>
>
> > Возможно даже, что у тебя никогда проблемм и не будет,
>  а
> > будут они у пользователей!
> >
>
> А какие. Пусть у меня перед сном вообще моск прокиснет и
> я как Гоголь возьму и сотру эти модули, которые писал и
> доробатывал 1,5 года :)
>

Ну вот давеча наблюдали всем техотделом такую ситуацию. В программе, где идёт работа с портом возникло исключение. Программа сдохла, но перезапустить её не было никакой возможности. Даже на CAD система не реагировала! :-)



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.043 c
3-1159116348
AngeL B.
2006-09-24 20:45
2006.11.26
Как изменить запрос, чтобы получить кол-во строк?


15-1162569581
ProgRAMmer Dimonych
2006-11-03 18:59
2006.11.26
Что случилось с otvet.mail.ru?


15-1163061314
Cyrax
2006-11-09 11:35
2006.11.26
Несколько злых вопросов, касающихся Delphi


1-1160656672
Ш-К
2006-10-12 16:37
2006.11.26
Singleton и интерфейсы


15-1162996386
oldman
2006-11-08 17:33
2006.11.26
Нет ли устройства по перекодирования сигнала?