Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизОстановка потока Найти похожие ветки
← →
isasa © (2006-08-28 10:58) [40]Slym © (28.08.06 04:43) [30]
.... как хочется в него чегонибудь добавить, например обрыв синхронных вызовов
Для таких случаев даден флаг Terminated, что-бы нормально разрулить логику внутри метода Execute. Конечно, если сносить поток шашкой (TerminateThread), то тогда все равно. :)
← →
Ketmar © (2006-08-28 11:00) [41]> [38] isasa © (28.08.06 10:53)
не для фанатов, а для менеджера памяти. %-)
← →
y-soft © (2006-08-28 11:01) [42]>Ketmar © (28.08.06 11:00) [41]
И для правильной обработки исключений
← →
BiN © (2006-08-28 11:02) [43]
> 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. Не начинающие же.
← →
Ketmar © (2006-08-28 11:06) [44]> [42] y-soft © (28.08.06 11:01)
а исключения без менеджера памяти не живут. %-)
← →
y-soft © (2006-08-28 11:08) [45]>BiN © (28.08.06 11:02) [43]
Инструмент, конечно, не виноват, повторюсь: ОСОБО кривого нет, написано добротно. Виноваты кривые руки. Только вот всегда есть выбор - есть, что дают, или приготовить самому, если не устраивает
← →
Ketmar © (2006-08-28 11:10) [46]> [45] y-soft © (28.08.06 11:08)
конечно, выбор есть. но если кто-то не любит селёдку, это не причина ругать повара?
← →
y-soft © (2006-08-28 11:11) [47]>Ketmar © (28.08.06 11:06) [44]
> [42] y-soft © (28.08.06 11:01)
а исключения без менеджера памяти не живут. %-)
Unhandled exceptions еще как живут и побеждают с криком: "Ваше приложение выполнило недопустимую операцию и будет закрыто" :)
← →
Ketmar © (2006-08-28 11:12) [48]> [47] y-soft © (28.08.06 11:11)
а мы их напугаем SetUnhandledExceptionFilter()"ом. %-)
← →
y-soft © (2006-08-28 11:12) [49]>Ketmar © (28.08.06 11:10) [46]
Не повара, а блюдо
← →
y-soft © (2006-08-28 11:14) [50]>Ketmar © (28.08.06 11:12) [48]
а мы их напугаем SetUnhandledExceptionFilter()"ом. %-)
Ну, ежели охота в такие глубины лезть :)
← →
Slym © (2006-08-28 12:02) [51]Ketmar © (28.08.06 10:43) [35]
> прерывать синхронный вызов
это что такое? поподробней можно?
procedure TxThread.Execute;
begin
while not terminated do
Event.WaitFor(INFINITY);
end;
еслиб procedure TThread.Terminate; был virtual яб его
procedure TxThread.Terminate; override;
begin
inherited;
Event.Signal;
end;
← →
Ketmar © (2006-08-28 12:11) [52]ну напиши свой класс. там кода-то...
← →
Slym © (2006-08-28 14:05) [53]сделай так чтоб этот код выполнялся менее секунды :)
ограничения:
1. публиковать Event низя, или иначе управлять им не из TxThreadprogram Project1;
{$APPTYPE CONSOLE}
uses classes,SyncObjs,Windows;
type
TxThread=class(TThread)
private
Event:TSimpleEvent;
protected
procedure Execute;override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
end;
constructor TxThread.Create(CreateSuspended: Boolean);
begin
Event:=TSimpleEvent.Create;
inherited;
end;
destructor TxThread.Destroy;
begin
inherited;
Event.Free;
end;
procedure TxThread.Execute;
begin
repeat
Event.WaitFor(60000);
writeln("loop :)");
until terminated;
end;
var x:TxThread;
begin
x:=TxThread.Create(false);
sleep(0);
x.Free;
writeln("Final!");
end.
← →
Ketmar © (2006-08-28 14:32) [54]> [53] Slym © (28.08.06 14:05)
и не подумаю. ибо если мне нужны такие условия, то я буду думать над переделкой кода, а не над тем, как вилами геморрой лечить. %-)
← →
Slym © (2006-08-29 04:34) [55]Ketmar © (28.08.06 14:32) [54]
ибо если мне нужны такие условия
ИнкапсЮляция батенька :)
← →
Ketmar © (2006-08-29 09:47) [56]> [55] Slym © (29.08.06 04:34)
нет. апофигеоз. %-)
← →
Destroyer © (2006-08-30 16:11) [57]Такой вопрос. Нужно выполнять действие, в данном случае деактивировать кнопку на главной форме, при каждом завершении потока. Что-то типа события OnTerminate. Подскажите как такое осуществить.
← →
Dmitrij_K (2006-08-30 16:14) [58]OnTerminate не подходит?
← →
Destroyer © (2006-08-30 16:21) [59]А как с OnTerminate?
Вот решил эту проблему так:
...
public
destructor Destroy; override;
...
destructor TimerThread.Destroy;
begin
inherited;
MainForm.StopOperationButton.Enabled:=false;
end;
← →
Reindeer Moss Eater © (2006-08-30 16:22) [60]Какого только бреда не придумают, только чтобы не думать головой.
← →
Dmitrij_K (2006-08-30 16:25) [61]Thread.OnTerminate := твоё
сникерсни Ж)
← →
Reindeer Moss Eater © (2006-08-30 16:26) [62]Создай поток, передай ему хендл главного окна.
Если собираешься прибивать поток снаружи сохрани хендл потока.
В конце Execute пошли сообщение хендлу окна.
В обработчике сообщения главного окна прими сообщение.
И все.
← →
y-soft © (2006-08-30 17:51) [63]>Reindeer Moss Eater © (30.08.06 16:26) [62]
С Вашего позволения дополню
Именно главного окна (Application.Handle), а не главной формы, и обрабатывать в Application.OnMessage... И использовать PostMessage
← →
Reindeer Moss Eater © (2006-08-30 18:42) [64]разницы-то вроде никакой
← →
y-soft © (2006-08-30 20:21) [65]>Reindeer Moss Eater © (30.08.06 18:42) [64]
Из условия не видно, что пользователь не может произвести действия, которые вызовут, например, RecreateWnd для главной формы, и в конечном итоге изменят хендл ее окна. С окном приложения такого точно не произойдет
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.049 c