![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дополнительный поток и Exception в главном. Что будет?
Kolan © (2006-10-15 22:43:00)Здравствуйте,
В программе есть доп поток. Что будет с доп. потоком если в гл. потоке произойдетException?
Percent (2006-10-16 01:08:00) [61]Угадай :) FreeOnTerminate := True;
Sleep(10); - типа, ожидание самоубийства потока?
Kolan (2006-10-16 01:07:00) [62]
> Начиная с D5+ обработка исключений во вторичном потоке изменилась.
>
Кстати делаю все на D2006
Leonid Troyanovsky (2006-10-16 01:06:00) [63]
> Percent (16.10.06 00:57) [62]
> При возникновении исключения в потоке, если это исключение
> не перехватывается программным кодом потока, происходит
> "аварийное" завершение потока, и поток удаляется средствами
Начиная с D5+ обработка исключений во вторичном потоке изменилась.
Т.е., до того, необработанные исключения в потоке приводили
к завершению приложения (что и есть правильно).
Ну, а куда деваются исключения нынче надо посмотреть.
В понедельник, т.е., уже сегодня, наверное :)
--
Regards, LVT.
Kolan (2006-10-16 01:06:00) [64]
> Возможно даже, что у тебя никогда проблемм и не будет, а
> будут они у пользователей!
>
А какие. Пусть у меня перед сном вообще моск прокиснет и я как Гоголь возьму и сотру эти модули, которые писал и доробатывал 1,5 года :)
Kolan (2006-10-16 01:05:00) [65]
> Тут главное слово пока! Возможно даже, что у тебя никогда
> проблемм и не будет, а будут они у пользователей!
Тут бы с этим разобраться. Связь устраиватет. Вот будет неработатья тебя вспомню :).
> А где здесь удаление потока?
Угадай :)FreeOnTerminate := True;
Kolan (2006-10-16 01:03:00) [66]
> А с чего-то он вдруг попал в suspend?
> С этим, дейс-но, надо разобраться, вне зависимости от
> прошлых обсуждений.
Я его попросил. Общий смысл.
1. Прихдят данные. Надо выделить пакет(Начало и конец искать надо).
2. Но пакеты длинные и приходят частями.
Поэтому я завел поток(о нем мы и говорили все это время). Как только что-то пришло оно кладется в буффер потока и поток просыпается и начинает просматривать данные.
Если все вновь прибывшее просмотрел и пакет не нашел - засыпает. Если нашел Выдает его - это и естьSynchronize(SendPackage);.
Германн (2006-10-16 01:01:00) [67]
> Kolan © (16.10.06 00:55) [61]
>
>
> > (работа с внешним устройством по СОМ-порту в доппотоке)
>
> Это пока не трогаем - это тоже есть, это не ток поток,
> и это надо в отдельную конференцию....
>
> Кстати пока с этим проблем не возникало, те получить данные
> из порта - проблем нет...
>
Тут главное слово пока! Возможно даже, что у тебя никогда проблемм и не будет, а будут они у пользователей!
Percent (2006-10-16 00:59:00) [68]А удаляю поток так:
destructor TConnectionManager.Destroy;
begin
FCommPort.Free;
FCommReadThread.Terminate;
FCommReadThread.Resume;
FPackageComposer.Free;
FPackageExtractor.Terminate;
FPackageExtractor.Resume;
Sleep(10);
inherited Destroy;
end;
А где здесь удаление потока?
Kolan (2006-10-16 00:58:00) [69]
> На то он и Synchronize, чтоб ждать, пока все не кончится
> в первичном.
Вот она истина, а мне нужен такой же Synchronize(тока без крыльев), но чтобы не ждал. Те это PostMessage, но он не подходит. Очень не хочется так делать. Некрасиво если форма знает о каком-то порте... Я считаю, что она не должна.
Leonid Troyanovsky (2006-10-16 00:58:00) [70]
> Kolan © (16.10.06 00:53) [60]
> Если удаляю не так, то я не виноват :) как-то тут обсуждал
> как удалить спящий, не спящий поток.. Получилось так.
А с чего-то он вдруг попал в suspend?
С этим, дейс-но, надо разобраться, вне зависимости от
прошлых обсуждений.
--
Regards, LVT.
Percent (2006-10-16 00:57:00) [71]Но почему "Неверый дискриптор" при закрытии?
При возникновении исключения в потоке, если это исключение не перехватывается программным кодом потока, происходит "аварийное" завершение потока, и поток удаляется средствами ОС как "преждевременно почивший". То есть, поток - это сущность ОС, и реальное управление им осуществляет ОС. При завершении приложения, производится обращение к потоку, уже удаленному средствами ОС. А так как потока уже реально не существует, то и дескриптор его - неверный. Типа как-то вот так. Читай внимательно про обработку исключений в потоках. То есть, я хотел сказать, что выпускать исключение из потока не следует...
Kolan (2006-10-16 00:55:00) [72]
> (работа с внешним устройством по СОМ-порту в доппотоке)
Это пока не трогаем - это тоже есть, это не ток поток, и это надо в отдельную конференцию....
Кстати пока с этим проблем не возникало, те получить данные из порта - проблем нет...
Kolan (2006-10-16 00:53:00) [73]Так... точно есть...
А удаляю поток так:
destructor TConnectionManager.Destroy;
begin
FCommPort.Free;
FCommReadThread.Terminate;
FCommReadThread.Resume;
FPackageComposer.Free;
FPackageExtractor.Terminate;
FPackageExtractor.Resume;
Sleep(10);
inherited Destroy;
end;
ПриFCommReadThread.Resume;и получается "Неверный дескриптор". Вот наверно почему.
Если удаляю не так, то я не виноват :) как-то тут обсуждал как удалить спящий, не спящий поток.. Получилось так.
Ладно надо думать как переделать.
PS
Тема не закрыта..
Германн (2006-10-16 00:52:00) [74]Всё прочесть не осилил.
Но помимо одного "геморроя" (работа с внешним устройством по СОМ-порту в доппотоке), добавлен ещё и второй - "проблемы с исключениями в доппотоках".
P.S. Из анекдота всем известного - "Доктор, я буду жить? Будешь, но х#%во!"
Leonid Troyanovsky (2006-10-16 00:51:00) [75]
> Kolan © (16.10.06 00:44) [55]
> Чем больше думаю ... Все таки не может быть, что доп поток
> ждет пока закончится метод в Synchronize.
На то он и Synchronize, чтоб ждать, пока все не кончится
в первичном.
--
Regards, LVT.
Ketmar (2006-10-16 00:46:00) [76]цитата из справки: "Execution of the thread current is suspended while Method executes in the main thread."
Kolan (2006-10-16 00:45:00) [77]Ладно, завтра тему еще подниму. Так как не разобрался я нифига, еще больше запутался.
Kolan (2006-10-16 00:44:00) [78]
> резюмируя: Synchronize() -- это очень быстро, и обязательно
> должно завершиться безо всяких исключений. надо обработку
> -- сохраняй где-то данные, возвращайся из SendPackage(),
> и обрабатывай уже потом. а то у тебя не параллельная работа
> получается, а непонятно что.
Чем больше думаю ... Все таки не может быть, что доп поток ждет пока закончится метод в Synchronize. По косвенной причине точно. Иногда доп поток работает оч. интенсивно, если бы он ждал данные испортились бы...
Ketmar (2006-10-16 00:40:00) [79]>[52] Kolan(c) 16-Oct-2006, 00:37
ой, ну тебя. если завтра проснусь -- проверю и попробую что-то внятное сформулировать. коли до того кто не расскажет. и ежели я не забуду да не обломлюсь. %-)
Kolan (2006-10-16 00:40:00) [80]
> Тогда, как обычно, как будто их вовсе нет.
Да, понятно. Окна нет будет.
Вот, с этим я разобрался.
Те. при ре райзе обработка должна быть в доп потоке. Если его нет, то в главном все заканчиватся. Так?
Но почему "Неверый дискриптор" при закрытии? Ошибка в 17 строке что-ли?