Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TThread [D6, WinXP]


Страницы:   1 2

__Unknown__ ©   (2007-07-11 19:59:00) 

Хотел спросить, корректно ли
использовать такую конфигурацию!

В потоке за место метода Synchronize() использовать
TCriticalSection!

т.е.:

...
CriticalSection.Enter;
OnData(Self);
CriticalSection.Leave;
...

И следующий вопрос:
Если у меня запущен поток и мне надо добавить в него данные, его обязательно приостанавливать или нет?


slow.alfamoon.com   (2007-07-18 11:10:00) [1]

я конечно не эксперт но скажу -  у нас были бааальшие проблемы именно из-за того что исключение вылетало в потоке и не ловилось. BeginThread я не копал, не знаю, но проблема есть.


Инс   (2007-07-17 19:05:00) [2]

О, Рома :) Какая встреча!


> [23] SLoW.AlfaMoon.Com   (17.07.07 10:34)

Хм.. Что-то необъяснимое ты мне говоришь. Либо я с ума сошел под конец дня, либо в TThread поток создается с помощью BeginThread, которая в любом случае заключает тело потока в SEH-фрейм.


SLoW.AlfaMoon.Com   (2007-07-17 17:49:00) [3]

DVM
+1 разумеется


SLoW.AlfaMoon.Com   (2007-07-17 17:48:00) [4]

Неаккуратно написал... последнее предложение читать так: Т.е. обнаружить оное практически очень сложно если нет обработчиков исключений


Anatoly Podgoretsky   (2007-07-17 14:34:00) [5]

> SLoW.AlfaMoon.Com  (17.07.2007 10:34:23)  [23]

А почему нет, может стоит озаботиться?


DVM   (2007-07-17 14:08:00) [6]


> Т.е. обнаружить оное практически очень сложно.

Совсем не сложно, если об этом позаботиться заранее


SLoW.AlfaMoon.Com   (2007-07-17 10:34:00) [7]

2 Инс

С исключениями в потоках да и в dll вообще ситуация темная. ПРи выбросе исключения в потоке поток просто замерзает и все, если нет обработчиков исключений. Т.е. обнаружить оное практически очень сложно.


Инс   (2007-07-15 13:22:00) [8]


> Случай такой Class который вызывал MyThreadClass и иногда
> было так что THREAD завершился а мой Class вызывал  WaitFor
> на чем и вис!

Рад, что все заработало, но вот интерпретровали ошибку вы точно не правильно. Если поток уже завершился, то MsgWaitForMultipleObjects вернет управление сразу же, а не зависнет. Так что... что-то вы не так поняли либо нам не договариваете ;-)


__Unknown__   (2007-07-15 12:03:00) [9]

Я разобрался! Вопрос снят! :)
Случай такой Class который вызывал MyThreadClass и иногда было так что THREAD завершился а мой Class вызывал  WaitFor на чем и вис!
Т.к. я посмотрел, что в Thread метод WaitFor использует MSGWaitForMultipleEvents(если не ошибаюсь) и на этом виснет!!!!! :)
Баг написан мной!!!! Слишком намудрил с проверками в событиях!
Исправил, все работает :)
Всем спасибо


Инс   (2007-07-12 10:32:00) [10]


> Или в теле поточной функции возникло необработанное исключение.


И что? В этом случае поток почти сразу же завершится. И WaitFor вернет управление. Разве нет?


Сергей М.   (2007-07-12 08:12:00) [11]


> Виснет на WaitFor если убираю, то на Free


Это означает что метод Thread.Execute по каким-то причинам не завершает свое выполнение.
Или в теле поточной функции возникло необработанное исключение.


Инс   (2007-07-11 21:41:00) [12]


> [16] __Unknown__   (11.07.07 21:31)


В общем-то правильно. Почему же зависает? Взаимная блокировка из-за использования Syncronize маловероятна, так как из WaitFor вызывается CheckSynchronize. Но очевидно, что поток FClient не может завершиться, попробуйте разобраться почему.


__Unknown__   (2007-07-11 21:34:00) [13]

Виснет на WaitFor если убираю, то на Free; ;)


__Unknown__   (2007-07-11 21:31:00) [14]

Да извини! :)

If Not FClient.Terminated Then
 Begin
    FClient.Terminate;
    FCliet.WaitFor;
 End;
FClient.Free;


Инс   (2007-07-11 21:25:00) [15]


> А после WaitFor все зависает!


Я конечно не телепат, но вы WaitFor точно из главного потока вызываете? Нужно так:
th1.Terminate;
th1.WaitFor;


__Unknown__   (2007-07-11 21:23:00) [16]

Внутри как положено!
While Not Terminated do
Begin
...
End;

А после WaitFor все зависает!
Все синхронизации возвращаются нормально, т.к. в них только указания статуса и вывод информации на экран!
Все как должно быть и все равно почему-то не работает :)
Вот поэтому и задал вопрос!


Инс   (2007-07-11 21:19:00) [17]

А флажок Terminated внутри потока анализируете?

Кстати, после вызова Terminate можно дождаться его завершения. Например, с помощью метода WaitFor


__Unknown__   (2007-07-11 21:15:00) [18]

Thread.Terminate;


Инс   (2007-07-11 21:06:00) [19]


> T.е. я делаю Terminate


Какой Terminate? TThread.Terminate, Application.Terminate, TerminateThread, TerminateProcess?


__Unknown__   (2007-07-11 21:02:00) [20]

T.е. я делаю Terminate и приэтом должен отработать скажем OnTerminate, но иногда до него не доходит! Но мне при этом нужно записать оставшиеся данные... Получается так, что я теряю данные!


Страницы:   1 2

Наверх

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