![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, как можно сделать, что бы при старте потока проверялось, если он существует, то уничтожить его и запустить снова.
Пробовал так: Сам поток (лежит на модуле формы) Код:
type thread = class(tthread) private procedure create; procedure load; procedure show; procedure resiz; public procedure execute; override; end; Выполнение Код:
procedure thread.Execute; begin load; synchronize(create); sleep(50); synchronize(show); sleep(50); if str=true then synchronize(resiz); pot:=nil; end; Запуск Код:
if pot<>nil then begin pot.Terminate; pot:=nil; end; pot:=thread.Create(true); pot.FreeOnTerminate:=true; pot.Priority:=tpnormal; pot.Resume; И если много раз запустить его, то он не уничтожается. А т.к. поток работает с компонентами на форме, происходит AV. Даже проверял, убирал все процедуры, кроме одной, в ней писал: memo....add('поток запущен'); sleep(5000); memo....add('поток завершён'); Нажимал быстро раз 10 на кнопку, которая запускает поток, и через пять секунд в мемо десять раз написало "поток завершён" Помогите пожалуйста. Поиск не помог, почти все темы про Terminate, а как на писать условие нигде нет. |
|
#2
|
|||
|
|||
|
Цитата из справки Delphi:
Цитата:
|
|
#3
|
|||
|
|||
|
Попробуйте, например, так:
Код:
// ...
TMyThread = class(TThread)
private
protected
procedure Execute; override;
end;
// ...
var myThread: TMyThread = nil;
myThreadID: Cardinal = 0;
procedure TMyThread.Execute;
begin
// Код
// ...
// Бесконечный цикл, чтобы проверить, что поток действительно уничтожается
while True do
begin
Synchronize(
procedure
begin
// Код, который работает с VCL
Form1.Label1.Caption := 'Время: ' + TimeToStr(Time) +
' | Объектов: ' + IntToStr(Random(10000)) +
' | Поток: ' + IntToStr(myThreadID);
end
);
Sleep(1000);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if myThread <> nil then TerminateThread(myThread.Handle, 0);
inc(myThreadID);
myThread := TMyThread.Create(True);
myThread.FreeOnTerminate := True;
myThread.Priority := tpNormal;
myThread.Resume;
end;
// ...Проследить за тем, что количество потоков не растёт, можно в диспетчере задач, выбрав "Вид - Выбрать столбцы..." и установив флажок напротив "Счетчик потоков". Последний раз редактировалось Delphinaut, 31.01.2016 в 16:53. |
| Этот пользователь сказал Спасибо Delphinaut за это полезное сообщение: | ||
Loca (01.02.2016)
| ||
|
#4
|
|||
|
|||
|
Цитата:
То, что нужно, всё получилось, спасибо за помощь ![]() |
|
#5
|
||||
|
||||
|
вообще просто так использовать TerminateThread не совсем true:
Цитата:
|