Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.01.2016, 11:30
Loca Loca вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 20
Версия Delphi: delphi 10
Репутация: 518
По умолчанию Уничтожение и повторный запуск потока

Здравствуйте, как можно сделать, что бы при старте потока проверялось, если он существует, то уничтожить его и запустить снова.
Пробовал так:

Сам поток (лежит на модуле формы)
Код:
  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  
Старый 31.01.2016, 15:29
Delphinaut Delphinaut вне форума
Прохожий
 
Регистрация: 28.01.2016
Сообщения: 11
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Цитата из справки Delphi:
Цитата:
System.Classes.TThread.Terminate

Description

Signals the thread to terminate by setting the Terminated property to true.

Terminate sets the thread's Terminated property to true, signaling that the thread should be terminated as soon as possible.

For Terminate to work, the thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's true.

Note: Unlike the Windows API TerminateThread MSDN, which forces the thread to terminate immediately, the Terminate method merely requests that the thread terminate. This allows the thread to perform any cleanup before it shuts down.
Ответить с цитированием
  #3  
Старый 31.01.2016, 15:53
Delphinaut Delphinaut вне форума
Прохожий
 
Регистрация: 28.01.2016
Сообщения: 11
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Попробуйте, например, так:

Код:
  // ...

  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  
Старый 01.02.2016, 05:02
Loca Loca вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 20
Версия Delphi: delphi 10
Репутация: 518
По умолчанию

Цитата:
Сообщение от Delphinaut
Попробуйте, например, так:

Код:
  // ...

  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;

// ...

Проследить за тем, что количество потоков не растёт, можно в диспетчере задач, выбрав "Вид - Выбрать столбцы..." и установив флажок напротив "Счетчик потоков".

То, что нужно, всё получилось, спасибо за помощь
Ответить с цитированием
  #5  
Старый 01.02.2016, 08:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще просто так использовать TerminateThread не совсем true:
Цитата:
TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.
обычно всегда возможно сделать корректное завершение работы потока по сигналу из основного. ведь даже не прерываемый Sleep можно заменить прерываемым WaitForSingleObject на event object.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:50.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025