![]() |
|
|
Регистрация | << Правила форума >> | 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:
Цитата:
Пишу программы за еду. __________________ |