Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Дополнительный поток и 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.63 MB
Время: 0.043 c
15-1163084803
Slaga
2006-11-09 18:06
2006.11.26
Передать файл с сервера на клиент и наоборот


2-1163170682
³²³
2006-11-10 17:58
2006.11.26
TTimer


15-1163106755
ArtemESC
2006-11-10 00:12
2006.11.26
Как FAR e закрепить режим сортировки?


9-1139254718
D@rk
2006-02-06 22:38
2006.11.26
Fps


1-1160593484
flaxe
2006-10-11 23:04
2006.11.26
Встраивание в чужой процесс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский