![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Остановка потока [D7, WinXP]
Destroyer © (2006-08-26 21:28:00)Задача выполняется в потоке. По нажатию кнопки на форме надо остановить выполнение потока. Проверять флаг постоянно на отключение - не подходит. Нужно что-то типа TimerThread.Destroy.
Делаю так:
protected
procedure Execute; override;
public
constructor Create(FPath: String; Fflag: boolean; RProcType:string; FExt:string);
constructor Destroy;
end;
...
constructor TimerThread.Destroy;
begin
exit;
end;
Но так, выдается ошибка неверный дескриптор.
Как правильно мгновенно остановить поток?
y-soft (2006-08-28 11:08:00) [21]>BiN © (28.08.06 11:02) [43]
Инструмент, конечно, не виноват, повторюсь: ОСОБО кривого нет, написано добротно. Виноваты кривые руки. Только вот всегда есть выбор - есть, что дают, или приготовить самому, если не устраивает
Ketmar (2006-08-28 11:06:00) [22]> [42] y-soft © (28.08.06 11:01)
а исключения без менеджера памяти не живут. %-)
BiN (2006-08-28 11:02:00) [23]
> y-soft © (28.08.06 10:55) [39]
>
> Несколько безаппеляционно сказано. IMHO, конечно :)
Ок, аппеляции:
> y-soft © (27.08.06 22:31) [21]
>
> >Пусик © (27.08.06 22:27) [19]
>
> А что в нем кривого особо?
>
> ОСОБО кривого нет. Есть отдельные недодуманности. Например
> метод Synchronize - основная причина тормозов в многопоточных
> программах начинающих :)
Виноват кто? Ну, конечно же, TThread. Не начинающие же.
y-soft (2006-08-28 11:01:00) [24]>Ketmar © (28.08.06 11:00) [41]
И для правильной обработки исключений
Ketmar (2006-08-28 11:00:00) [25]> [38] isasa © (28.08.06 10:53)
не для фанатов, а для менеджера памяти. %-)
isasa (2006-08-28 10:58:00) [26]Slym © (28.08.06 04:43) [30]
.... как хочется в него чегонибудь добавить, например обрыв синхронных вызовов
Для таких случаев даден флаг Terminated, что-бы нормально разрулить логику внутри метода Execute. Конечно, если сносить поток шашкой (TerminateThread), то тогда все равно. :)
y-soft (2006-08-28 10:55:00) [27]>BiN © (28.08.06 10:47) [37]
Несколько безаппеляционно сказано. IMHO, конечно :)
isasa (2006-08-28 10:53:00) [28]:)
В общем, отсюда вывод, юзаем CreateThread (для фанатов BeginThread).
BiN (2006-08-28 10:47:00) [29]Любые высказывания в сторону кажущейся кривости реализации TThread необоснованны и посему - бред.
имо.
Ketmar (2006-08-28 10:43:00) [30]> [33] Slym © (28.08.06 10:14)
"завернуть" и "перекрыть" -- вещи разные.
Ketmar (2006-08-28 10:43:00) [31]> [34] Slym © (28.08.06 10:18)
> сработает после выхода из процедуры потока...
и в чём проблема, если всё равно создаётся класс-потомок? нужные переменные -- в поля.
> прерывать синхронный вызов
это что такое? поподробней можно?
Slym (2006-08-28 10:18:00) [32]Ketmar © (28.08.06 5:00) [32]
обработчик события OnTerminate()
сработает после выхода из процедуры потока...
прерывать синхронный вызов в OnTerminate бессмысленно, т.к. он уже отвалился сам. вот еслиб был OnBeforeTerminate
Slym (2006-08-28 10:14:00) [33]Fay © (28.08.06 4:51) [31]
Коран не запрещает завернуть Terminate в свой метод
А дальнейшее приведение типа TThread(Thread).Terminate? или сунуть руки в генофонд?
Ketmar (2006-08-28 05:00:00) [34]равно как сделать обработчик события OnTerminate().
Fay (2006-08-28 04:51:00) [35]2 Slym © (28.08.06 4:43) [30]
> Terminate - не виртуальный, как хочется в него
> чегонибудь добавить, например обрыв синхронных вызовов
Коран не запрещает завернуть Terminate в свойметод
Slym (2006-08-28 04:43:00) [36]Мой пинок в бочину TThread - Terminate - не виртуальный, как хочется в него чегонибудь добавить, например обрыв синхронных вызовов
Ketmar (2006-08-27 23:03:00) [37]> [27] Пусик © (27.08.06 22:46)
> асинхронной синхронизации
не надо так шутить на ночь глядя. %-)
y-soft (2006-08-27 22:59:00) [38]>Пусик © (27.08.06 22:46) [27]
Безопасная реализация достаточна сложна. Начинающему явно не по зубам
Хотя... Можно, например, сделать так:
http://y-soft.comsignal.ru/Delphi/ThreadX_pas.html(просьба сильно не пинать) :)
Пусик (2006-08-27 22:46:00) [39]
> y-soft © (27.08.06 22:40) [26]
> >Ketmar © (27.08.06 22:36) [23]
>
> Проблема в том, что не предусмотрено метода Asynchronize
> :)
Ну как раз реализация асинхронной синхронизации не представляет сложности;)
y-soft (2006-08-27 22:40:00) [40]>Ketmar © (27.08.06 22:36) [23]
Проблема в том, что не предусмотрено метода Asynchronize :)