Форум: "Основная";
Текущий архив: 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