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?


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 строке что-ли?


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

Наверх

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