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