Odwołanie do wątku znając jego Handle lub ThreadID

0

Cześć Wszystkim,

Czy można się odwołać do wątku znając jego Handle lub ThreadID. W przypadku kontrolek vcl działa coś takiego

TEdit(FindControl(Handle)).Text := 'Tekst';

Potrzebuję coś na wzór poniższej instrukcji.

TMyThread(Handle).parametr := coś
0

Skoro używasz klasy TThread, to do czego Ci potrzebne uchwyty? Przechowuj obiekty tych wątków w jakiejś liście, to nie będziesz musiała ich szukać.

0

Wątek za pomocą procedury postmessage lub sendmessage wysyła wiadomość z rezultatem a w LParam zwraca handle wątku. I teraz tak wątków jest wiele a procedura do obsługi komunikatu jedna i ta procedura musi wiedzieć który wątek ją wywołał aby mogła odczytać dane które opracował dany wątek. Dlatego musi być jakiś sposób aby wykorzystać handle lub cokolwiek innego co będzie można przesłać procedurą sendmessage.

0

no a te dane gdzie są?

0

dostęp do danych był zdefiniowany w klasie wątku po przez property. W wątku używałam sendmessage po to aby po odczytaniu danych w procedurze wątek mógł zakończyć życie. Ale całość zrobiłam inaczej i działa. Zdefiniowałam zmienne ( wskaźniki ) w create wątku i wątek po wykonaniu zadania zwraca wartości na zmienne i kończy działanie.

Ale ciekawi mnie i tak czy można się tak odnieść do wątku jak napisałam w pierwszym poście

1
Agaziemowit napisał(a):

Wątek za pomocą procedury postmessage lub sendmessage wysyła wiadomość z rezultatem a w LParam zwraca handle wątku.

Prześlij w LParam wskaźnik na obiekt wątku, a nie jego uchwyt, a z drugiej strony go zrzutuj.

1
Agaziemowit napisał(a):

Zdefiniowałam zmienne ( wskaźniki ) w create wątku i wątek po wykonaniu zadania zwraca wartości na zmienne i kończy działanie.

nie do konca rozumiem - konczysz watek, zwalniasz obiekt a potem próbujesz sie dostac do jego danych?

0

Hey, dziękuję za odpowiedzi.

@abrakadaber Podczas tworzenia wątku wysyłam do niego wskaźniki(adresy) na zmienne które są z poza wątku ( w programie głównym ) i wątek po wykonanym zadaniu zapisuje do tych zmiennych wartości poczym kończy działanie i zwalnia pamięć. Więc wszystko jest poprawnie bez błędów.

@furious programming Próbowałam ale coś mi nie wychodziło jak wysłać LParam wskaźnik na obiekt wątku? LParam jest typu jak dobrze pamiętam NativeUInt a nie Pointer

1
Agaziemowit napisał(a):

@furious programming Próbowałam ale coś mi nie wychodziło jak wysłać LParam wskaźnik na obiekt wątku? LParam jest typu jak dobrze pamiętam NativeUInt a nie Pointer

Normalnie rzutuje się referencję na ogólny wskaźnik, a ten finalnie na liczbę:

uses
  Windows;

  function ObjectToLParam(const AObject: TObject): LPARAM;
  begin
    Result := LPARAM(Pointer(AObject));
  end;

  function LParamToObject(const ALParam: LPARAM): TObject;
  begin
    Result := TObject(Pointer(ALParam));
  end;

W Lazarusie działa też bezpośrednie rzutowanie referencji na liczbę i vice versa:

function ObjectToLParam(const AObject: TObject): LPARAM;
begin
  Result := LPARAM(AObject);
end;

function LParamToObject(const ALParam: LPARAM): TObject;
begin
  Result := TObject(ALParam);
end;

Nie wiem który sposób będzie działać pod Delphi – pierwszy powinien.

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