Hallöle. Ich habe mich nun auch mal mit der Threadprogrammierung beschäftigt und folgendes Konstrukt geschaffen:
Delphi-Quellcode:
function Thread(p: Pointer): Integer;
begin
try
Ping := u_retPing.ICMPPingRTT(u_retPing.DNSNameToIp(frmMainWindow.cmbIP.Text), Cardinal(1000));
result := 0;
except
on e:
exception do
result := 0;
end;
end;
Dies ist ein Thread zum anpingen eines Servers. Nun will ich in meiner Hauptprozedur die den Thread erstellt auch den Ping nutzen. Daher dachte ich mir: Hey, speicherst ihn doch einfach in einer globalen Variable.
Die Hauptprozedur ist nun folgende:
Delphi-Quellcode:
hThread := BeginThread(nil, 0, @Thread, nil, 0, ThreadID);
repeat
GetExitCodeThread(hThread, ExitCode);
Application.ProcessMessages;
sleep(1);
until (ExitCode = 0);
Ok, das funktioniert auch soweit. Aber gibt es auch eine andere Möglichkeit den Ping an meine Hauptprozedur zurückzugeben? Denn als "result := Ping" kann ich es nicht zurückgeben, da ja "result" der ExitCode ist, habe ich recht? Jedenfalls verändert sich der ExitCode je nachdem was ich als result schreibe.
Das zweite: Im Thread wird auf frmMainWindow.cmbIP.Text zugegriffen. Da dachte ich mir: Hey, übergibst das doch als Parameter. Was habe ich getan:
Delphi-Quellcode:
var
ThreadID: Cardinal;
hThread: THandle;
ExitCode: DWord;
ServerName: String;
PServerName: ^String;
begin
hThread := BeginThread(nil, 0, @Thread, PServerName, 0, ThreadID);
repeat
GetExitCodeThread(hThread, ExitCode);
Application.ProcessMessages;
sleep(1);
until (ExitCode = 0);
end;
Und im Thread selbst:
Delphi-Quellcode:
function Thread(p: Pointer): Integer;
begin
try
Ping := u_retPing.ICMPPingRTT(u_retPing.DNSNameToIp(p^), Cardinal(1000));
result := 0;
except
on e:
exception do
result := 0;
end;
end;
Und da ist der Fehler im Thread: "Incompatible types: 'string' and 'procedure, untyped pointer or untyped parameter'".
Da ich mich mit Threads noch nicht so gut auskenne wäre ich für eure Antworten dankbar.
Grüße,
Stefan