przekazywanie parametru do metody w wątku

0

Cześć, mam prośbę - czy możecie mi podpowiedzieć w jaki sposób wywołać metodę, która będzie uruchomiona w wątku?
Do wątków używam klasy TSimpleThread i jej konstruktora, który wygląda tak:

constructor TSimpleThread.CreateSimple(CreateSuspended: boolean;
  _Action: TThreadMethod; _Data: pointer);
begin
  ThreadMethod := _Action; // Set these BEFORE calling
  Data := _Data; // inherited Create()!
  FreeOnTerminate := True;
  inherited Create(CreateSuspended);
end; // TSimpleThread.Create

wywołanie metody w wątku:

watek := TSimpleThread.CreateSimple(false,PobierzDane,nil);

tylko nie mam pojęcia jak wskaźnikami przekazać parametry do metody PobierzDane, której definicja wygląda tak:

procedure TFormX.PobierzDane(Data: pointer);

Z góry dzięki za wskazówki :)

0
constructor TSimpleThread.CreateSimple(CreateSuspended: boolean;
  _Action: TThreadMethod; _FormX:TFormX; _Data: pointer);
begin
  ThreadMethod := _Action; // Set these BEFORE calling
  Data := _Data; // inherited Create()!
  FormX := _TFormX;
  FreeOnTerminate := True;
  inherited Create(CreateSuspended);
end; // TSimpleThread.Create

Wywołanie: FormX.PobierzDane(Data);

0

@_13th_Dragon: Niestety kiepskie rozwiązanie w moim przypadku. O ile w jednym przypadku mogę przerobić konstruktor TSimpleThread, o tyle chcąc uruchomić w wątku każdą metodę z klasy formularza pojawia się problem.

0

Jaki problem się pojawia?

0

Nie wiem czy dobrze rozumiem, ale z Twojego przykładu wynika, że dla każdej metody muszę napisać dedykowany konstruktor dla klasy wątku. Nie da się tego jakoś bardziej dynamicznie zrobić i przekazać parametrów przez _Data: pointer skoro już istnieje?

0

_Data jest typu wskaźnikowego więc możesz sobie tutaj wsadzić cokolwiek chcesz np. Stworzyć rekord na stercie i przekazać do niego wskaźnik.
Przykładowo tworzysz rekord:

TThreadParameter = record
  Name: string;
  Age: integer;
end;

I dajmy na to typ wskaźnikowy na niego:

  PPThreadParameter = TThreadParameter^;

Przydzielasz pamięć i przekazujesz wkaźnik na utworzony rekord

  new(PPThreadParameter);
  PPThreadParameter.Name = 'test';
  PPThreadParameter.Age = 71;

  //odpalenie twojej metody z parametrem 
  watek := TSimpleThread.CreateSimple(false, PobierzDane, PPThreadParameter);

W metodzie PobierzDane wystarczy rzutować _Data na typ PPThreadParameter, tylko pamiętaj że trzeba zwolnić ten rekord jak nie będzie potrzebny możesz to zrobić w metodzie PobierzDane albo po przekazaniu do wątku choć 2 opcja jest ryzykowna bo możesz zwolnić pamięć przed tym jak wątek ją odczyta.

Kod pisany z palca więc mogą być błędy

1 użytkowników online, w tym zalogowanych: 0, gości: 1