Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
15 / 13 / 5
Регистрация: 22.07.2015
Сообщений: 251

RAD 11+ TThread уничтожение объекта, очистка ссылки

02.11.2022, 14:10. Показов 2441. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Среда: RAD 11+
Задача: отобразить процесс выполнения процедуры/функции пользователю.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
type
  TMyThread = class(TThread)
    FFrmHnd:THandle;
  private
    procedure Execute; override;
  public
    constructor MyCreate(CreateSuspended:boolean;FrmHnd:THandle);
 end;
 
type
  TMyForm = class(TForm)
    FMyThread:TMyThread;
  private
    { Private declarations }
  public
    { Public declarations }
    constructor MyCreate(AOwner:TComponent);
    function ShowModal:integer;         override;
    procedure WndProc(var Message: TMessage); override;
    procedure DoClose(var Action: TCloseAction); override;
  end;
 
const
  Msg01=WM_User+1; //сообщение отправляемое мной в теле потока
  Msg02=WM_User+2; //сообщение отправляемое мной перед выходом с тела потока.
 
implementation
 
//поток
procedure TMyThread.Execute;
begin
  while not Terminated do
    begin
      //начало действий выполняемых в теле потоке.
      SendMessage(FFrmHnd,Msg01,0,0); //в некоторый момент выполнения тела потока
      //конец действий выполняемых в теле потоке.
      Sleep(3000); //задержка между повторами выполнения действий
    end;
    SendMessage(FFrmHnd,Msg02,0,0);
end;
 
constructor TMyThread.MyCreate(CreateSuspended:boolean;FrmHnd:THandle);
begin
  inherited Create(CreateSuspended); //метод предка.
  FFrmHnd:=FrmHnd; //handle окна, куда будут отправляться сообщения
end;
//динамически создаваемая форма
constructor TMyForm.MyCreate(AOwner:TComponent);
begin
  inherited CreateNew(AOwner);      //метод предка.
  FMyThread:=TMyThread.MyCreate(True,self.handle);
  FMyThread.Priority:=tpLower;      //приоритет.
  FMyThread.FreeOnTerminate:=False; //уничтожать по завершению, для уверенности что поток не уничтожен.
end;
 
Function TMyForm.ShowModal:integer;
begin
  FMyThread.Start;                    //старт выполнения потока.
  Result:=inherited ShowModal;  //метод предка.
end;
 
procedure TMyForm.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    Msg01: begin
      //тут предполагается изменения индикации в процессе работы потока с помощью Message.WParam или Message.LParam.
      //отладка. На текущий момент описан выход с цикла тела потока.
      ShowMessage('поток: сообщение в теле');  
      FMyThread.Terminate;  
    end;
    Msg02: begin
      //Завершение тела потока
      //отладка. На текущий момент описан выход с тела потока и отправка команды на закрытие формы.
      ShowMessage('поток: выход из тела');       
      SendMessage(self.Handle,WM_CLOSE,0,0);
    end;
    WM_Close: begin
      //действия выполняемые при закрытии формы
      ShowMessage('закрыть форму');       
      if Assigned(FMyThread) then    
        if not FMyThread.Terminated then  //если поток не завершен
          begin
            FMyThread.Terminate; //завершаю поток.
            //нужно дождаться завершения потока.
          end;
      inherited WndProc(Message);
    end
    else inherited WndProc(Message);   //метод предка.
  end;
end;
Вызов формы для отображения процесса выполнения.

Delphi
1
2
3
4
5
6
procedure TForm1.Button1Click(Sender: TObject);
var MyForm1:TMyForm;
begin
  MyForm1:=TMyForm.MyCreate(self);
  MyForm1.ShowModal;
end;
Вопросы:
На сколько корректна будет эта часть, не будет ли утечек??
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
    WM_Close: begin
      //действия выполняемые при закрытии формы
      ShowMessage('закрыть форму');       
      if Assigned(FMyThread) then    
        if not FMyThread.Terminated then  //если поток не завершен
          begin
            FMyThread.Terminate; //завершаю поток.
          //как корректно дождаться завершения потока и уничтожить объект и ссылку на него???
          //FMyThread.WaitFor;
          //if Assigned(FMyThread) then begin FMyThread.Destroy; FMyThread.NIL end;
          end;
      inherited WndProc(Message);
    end
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.11.2022, 14:10
Ответы с готовыми решениями:

Создание, Очистка, Уничтожение Форм
Всем снова Здравствуйте! Спасибо Всем кто ответил в предыдущих моих темах! Снова Возникли вопросы: 1. Как сделать так чтобы по...

Создание, уничтожение и очистка памяти от динамического массива
Здравствуйте. Создаю динамический массив, задаю размерность через SetLength(). Очищаю через присвоение каждому элементу массива значения...

уничтожение COM объекта
Здравствуйте, есть некий ком объект созданный на шарпе, его запускают из 1С, проблема в том что при закрытии формы обработки на 1С,...

20
Нарушитель
10896 / 5830 / 1289
Регистрация: 12.03.2015
Сообщений: 26,906
10.11.2022, 17:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Setix Посмотреть сообщение
И так
нашёл ошибку - исправь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2022, 17:57

Уничтожение объекта
В программе создаю класс с атрибутом(полем) QProcess *proc; в конструкторе выделяю память proc=new QProcess(this);. По нажатию клавиши...

Уничтожение объекта
здравствуйте, подскажите пожалуйста можно ли удалить объект класса "изнутри"? а "снаружи" только приравняв объекту null? ...

Уничтожение объекта
Добрый день! Как сделать объект допустим форму, само-уничтожаемой? Это что то похожее на алерты справа где часы, только это экземпляры...

Создание и уничтожение объекта
Всем привет! Давно известная проблема "Statement expected but 'PROCEDURE' found" постигла и меня. На Delphi сижу совсем недавно, поэтому...

Правильное уничтожение объекта
Добрый день, имеется следующий вопрос! Есть некоторый класс, который на вход (в конструктор) получает аргументы, после чего парсит их....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru