![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread [D6, WinXP]
__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, но иногда до него не доходит! Но мне при этом нужно записать оставшиеся данные... Получается так, что я теряю данные!