Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Funktion aus dem Hauptthread in einem extra Thread ausführen (https://www.delphipraxis.net/74143-funktion-aus-dem-hauptthread-einem-extra-thread-ausfuehren.html)

Florian_Meyer 28. Jul 2006 23:29


Funktion aus dem Hauptthread in einem extra Thread ausführen
 
Hallo,

ich habe eine Funktion, wenn ich auf eine Listbox klicke, sollen Informationen für den Eintrag angezeigt werden, unter anderem eine IP, für die Domain, die IP soll immer neu abgerufen werden, bei einem Klick auf einen Eintrag. So, damit das Programm aber nicht nach dem Klick hängt, möchte ich gerne eine Funktion GetIpAddress in einem extra Thread aufrufen.

Hat jemand eine Idee, wie ich das am besten anstellen könnte?

MfG.
F.M.

Corelgott 29. Jul 2006 01:28

Re: Funktion aus dem Hauptthread in einem extra Thread ausfü
 
hi

also vll ist das ein bissel über das ziel hinnaus aber egal...

ich würde, wenn du das echt über nen thread regel willst / musst das so machen:

Delphi-Quellcode:

unit untTResolve;

interface

uses Classes;

type
  TResolveEvent = procedure(Sender : TObject; Address : String; Ip : String) of Object;

type TResolve = class(TThread)
private
  _toResolve : String;
  FOnRes : TResolveEvent;

protected
  procedure execute; override;

public
  property OnIpResolved : TResolveEvent read FOnRes write FOnRes;
  procedure resolve(ip : String);
end;

implementation

{ TResolve }

procedure TResolve.execute;
var
  ResAddress : String;

begin
  inherited;

  // do resolving and all that stuff
  // ResAddress = fubar

  if assigend(FOnRes) then
    FOnRes(self, ResAddress, self._toResolve);

  self.Suspend();
end;

procedure TResolve.resolve(ip: String);
begin
  self._toResolve := ip;
  self.resume();
end;

end.

/// and the usage is....

procedure TForm1.Button1Click(Sender: TObject);
var
  res : TResolve;

begin
  res := TResolve.Create(true);
  res.OnIpResolved := self.HandleResolve;

  res.resolve();
end;

procedure TForm1.HandleResolve(Sender : TObject; Address : String; Ip : String);
begin
  listBox1.fubar := Address;
  // well normaly listBox1.items[...] and so on....
end;
so ich habe den code nicht getestet & auch nicht geprüft...
Aber summa summarum sollte es so gehen.. auch wenn das per event vll. etwas umständlich ist ^^

ist hoffentlich wenigstens ein ansatz...

cya
Corelgott

edit:

aso res local zu machen und nichht zu freen ist vll nicht sooo glücklich ^^...
also vll das noch anpassen ^^

Luckie 29. Jul 2006 05:46

Re: Funktion aus dem Hauptthread in einem extra Thread ausfü
 
Das suspend ist überflüssig, da der Thread sowieso zu ende ist an der Stelle. Desweiteren müssen alle Zugriffe auf die VCL mit Synchronize synchronisiert werden, da die VCL nicht threadsafe ist.

xaromz 29. Jul 2006 08:40

Re: Funktion aus dem Hauptthread in einem extra Thread ausfü
 
Hallo,

Du gibst das TThread-Objekt am Ende nicht frei. Besser ist das so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Res: TResolve;
begin
  Res := TResolve.Create(True);
  Res.FreeOnTerminate := True; //<----
  Res.OnIpResolved := HandleResolve;
  Res.Resolve(<DOMAIN>);
end;
Wenn Du so einen Thread öfter brauchst, ist es besser, ihn einmal zu erstellen und immer wieder schlafen zu legen, als ständig einen neuen Thread zu erstellen.

Gruß
xaromz

Florian_Meyer 29. Jul 2006 14:50

Re: Funktion aus dem Hauptthread in einem extra Thread ausfü
 
Ok,
vielen Dank erstmal. Ich werde das heute Abend einmal ausprobieren. Ich hoffe doch mal, dass das so klappen wird.

MfG
F.M.


Edit: hat alles wunderbar geklappt. Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz