powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание объекта с полем Thread с функцией Execute из текущего класса
12 сообщений из 12, страница 1 из 1
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834564
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Первопричина темы - невозможно запустить Thread дважды без пересоздания объекта
1. a:=Thread.Create(....)
2. a.Resume
3. Поток нормально отработал
4. a.Resume запустить еще раз невозможно
У меня на Create висят ряд функций, которые нежелательно выполнять многократно
Если ошибаюсь в выводах прошу поправить/подсказать ....


Как решение вижу создать класс у которого одно из полей будет Thread, но не знаю
как присвоить/установить функцию Thread.Execute взяв ее из текущего класса
Т.е.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
     AAA = class(TObject)
         ...........................
         ...........................        
     public 
         B: Thread;
         procudure  ExecuteMyObject; 

     constructor AAA.Create((..............)
     begin 
         B:=Thread.Create(False);
         B.Execute :=  ExecuteMyObject;   ????????????
        ///Здесь не понимаю как пойдет процесс присвоения и дальнейшей вызов. 
     end;

     procudure  ExecuteMyObject; 
     begin 
        /// основной функционал для выполнения в потоке ... 
     end;



Заранее благодарен !
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834582
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

поток работает от начала execute до конца execute. соответственно, если нужно что бы один и тот же поток отрабатывал несколько раз какой-то код в execute нужно сделать цикл. другой вариант - создать несколько экземпляров TYourThread, смотря что нужно
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834593
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Надо так - ввел параметры - отработал поток
- ввел другие параметры - отработал тот же поток c введенными параметрами

Цикл не подходит однозначно, сейчас я имею многократное пересоздание потоков

Можете что-то сказать относительно
поля Thread нового класса - как присвоить Execute ?
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834598
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вполне нормально создавать потоки заново.
Это одна из основных задач ОС, так что потоки - относительно дешево.
Дорогим может быть само создание класса потока, но и там нет ничего такого, чем программа не занимается непрерывно, и для оптимизации вполне подходят общепринятые методы.
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834599
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без понимания, что конкретно вы имели в виду, говоря про "ряд функций" в Create, подсказать ничего невозможно. Потому что сейчас мы имеем классику XYZ по GunSmoker ))
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834611
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinБез понимания, что конкретно вы имели в виду, говоря про "ряд функций" в Create, подсказать ничего невозможно. Потому что сейчас мы имеем классику XYZ по GunSmoker ))

Тут понимание такое что есть ряд операций, которые выполняются единоразово, и в их дублировании просто нет
логического смысла(ну например настройка приложения по NLS стандартам и т.д.)

Попытался сделать так - не знаю верно ли !!!
Уточните господа гуру - верно ли ПРИСВОИЛ метод Execute для потока

Код: pascal
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.
type
  TAddSpan = class;

  TAddExec = class(TThread)   //поле основного объекта
  private
    Parent: TAddSpan;
  protected
    //
  public
    constructor Create(aParent: TAddSpan);
    procedure   Execute; override;
  published
    //
  end;

  TAddSpan = class(TObject)   
  private
    thExec:   TAddExec;
 protected
    //
 public
    ......................
    procedure   ExecuteThread;
    procedure   ExecuteParent;
  published
    //
  end;

implementation

uses Main;

  constructor TAddExec.Create(aParent: TAddSpan);
  begin
    Parent:=aParent;
    Inherited Create(True);
  end;

  procedure TAddExec.Execute;
  begin
    Parent.ExecuteParent;
  end;


  procedure TAddSpan.ExecuteThread;
  begin
    thExec:=TAddExec.Create(Self);
    thExec.Resume;
  end;

  procedure TAddSpan.ExecuteParent;
  var I: Integer;
      L: TStringList;
  begin
    L:=TStringList.Create;
    for i:=1 to 20000000 do begin
      L.Add('Row '+IntToStr(I));
    end;
    L.SaveToFile('C:\WORK\rr12.txt');
    L.Free;
  end;



Так вроде все работает ....
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834627
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XЦикл не подходит однозначно, сейчас я имею многократное пересоздание потоков

Можете что-то сказать относительно
поля Thread нового класса - как присвоить Execute ?

Цикл отлично подходит - просто его надо правильно написать (примерный код):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
type
  TTaskProc=procedure (Self:TWrkThread;Param:pointer);
  TTaskProcObj=procedure (Self:TWrkThread;Param:pointer) of object;

procedure TWrkThread.Execute;
while not Terminated do
begin
  if WakeUpEvent.WaitFor then
  begin
    if Terminated then exit;
    if TaskProc<>nil then 
    begin
      TaskProc(Self,Param);
      TaskProc:=nil;
    end;
    If TaskProcObj<>nil then
    begin
      TaskProcObj(Self,Param);
      TaskProcObj:=nil;
    end;
  end;
end;



Работает так: Устанавливаем WrkThread.TaskProc (или TaskProcObj) , далее WrkThread.WakeUpEvent.SetEvent - процедура, которую задали в TaskProc выполняется в потоке, поток выполняет заданное и возвращается в состояние ожидания.
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834628
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Чуть ошибся в декларации:
Код: sql
1.
2.
3.
type
  TTaskProc=procedure (Sender:TWrkThread;Param:pointer);
  TTaskProcObj=procedure (Sender:TWrkThread;Param:pointer) of object;
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834637
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам нужен поток, чтобы в нем делать определенные вещи - постоянно или продолжительно долго..
Или вам время от времени надо выполнять асинхронные задачи?
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834641
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064HOME_X,
Чуть ошибся в декларации:
Код: sql
1.
2.
3.
type
  TTaskProc=procedure (Sender:TWrkThread;Param:pointer);
  TTaskProcObj=procedure (Sender:TWrkThread;Param:pointer) of object;




Чуток подправил - неопределенный класс первичного кода
(TAddSpan = class;) совсем не к месту, просто ссылка на метод объекта

Код: pascal
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.
type
  TMethod  = procedure of object;

  TAddExec = class(TThread)
  private
    ParentExecute: TMethod;
  protected
    //
  public
    constructor Create(aMethod: TMethod);
    procedure   Execute; override;
  published
    //
  end;


implementation

uses Main;

  constructor TAddExec.Create(aMethod: TMethod);
  begin
    Inherited Create(True);
    ParentExecute:=aMethod;
    FreeOnTerminate:=True;
    OnTerminate:=frMain.TerminateThread;
  end;

  procedure TAddExec.Execute;
  begin
    ParentExecute;
  end;

 ..................
 ..................
 ..................
 ..................

  procedure TAddSpan.ExecuteThread;
  begin
    thExec:=TAddExec.Create(Self.Execute);
    thExec.Resume;
  end;



Цикл не нужен ...запуск потока эпизодический, по требованию пользователя
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834642
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteВам нужен поток, чтобы в нем делать определенные вещи - постоянно или продолжительно долго..
Или вам время от времени надо выполнять асинхронные задачи?

Спасибо за участие - вроде догадался
как сделать ...(пример кода приведен)
...
Рейтинг: 0 / 0
Создание объекта с полем Thread с функцией Execute из текущего класса
    #39834655
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XX-CiteВам нужен поток, чтобы в нем делать определенные вещи - постоянно или продолжительно долго..
Или вам время от времени надо выполнять асинхронные задачи?

Спасибо за участие - вроде догадался
как сделать ...(пример кода приведен)

не думаю...

Если время от времени надо выполнять асинхронные задачи то зачем вам TThread, если есть удобный TTask, который идеально решает такие задачи?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание объекта с полем Thread с функцией Execute из текущего класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]