![]() |
Frage zu Threads und Rückgabewerten/Parametern
Hallöle. Ich habe mich nun auch mal mit der Threadprogrammierung beschäftigt und folgendes Konstrukt geschaffen:
Delphi-Quellcode:
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.
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; Die Hauptprozedur ist nun folgende:
Delphi-Quellcode:
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.
hThread := BeginThread(nil, 0, @Thread, nil, 0, ThreadID);
repeat GetExitCodeThread(hThread, ExitCode); Application.ProcessMessages; sleep(1); until (ExitCode = 0); 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:
Und im Thread selbst:
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;
Delphi-Quellcode:
Und da ist der Fehler im Thread: "Incompatible types: 'string' and 'procedure, untyped pointer or untyped parameter'".
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; Da ich mich mit Threads noch nicht so gut auskenne wäre ich für eure Antworten dankbar. Grüße, Stefan |
Re: Frage zu Threads und Rückgabewerten/Parametern
Hat keiner ne Antwort parat? :-/
|
Re: Frage zu Threads und Rückgabewerten/Parametern
Zitat:
Desweiteren ist der ExitCode deines Threads immer 0, egal ob der Ping fehlschlägt oder nicht. |
Re: Frage zu Threads und Rückgabewerten/Parametern
Zitat:
|
Re: Frage zu Threads und Rückgabewerten/Parametern
Du kannst deiner Thread-Funktion als Parameter eine selbst definierte Struktur übergeben, in der die Ein- und Ausgabe-Parameter enthalten sind.
|
Re: Frage zu Threads und Rückgabewerten/Parametern
Also in etwa so:
Delphi-Quellcode:
und im Thread dann
type
TPing = record IP: String; Ping: Integer; end; ... procedure test; var Test: TPing; PTest: ^TPing; hThread: THandle; ThreadID: Cardinal; begin PTest := @Test; hThread := BeginThread(nil, 0, @Thread, PTest, 0, ThreadID); repeat GetExitCodeThread(hThread, ExitCode); Application.ProcessMessages; sleep(1); until (ExitCode = 0); ShowMessage(IntToStr(Test.Ping)); end;
Delphi-Quellcode:
Richtig so?
function Thread(p: Pointer): Integer;
begin try Ping := u_retPing.ICMPPingRTT(u_retPing.DNSNameToIp(p^.IP), Cardinal(1000)); result := 0; except on e:exception do result := 0; end; end; |
Re: Frage zu Threads und Rückgabewerten/Parametern
Zitat:
Etwas umgeschrieben:
Delphi-Quellcode:
type
PPingThreadParam = ^TPingThreadParam; TPingThreadParam = record IP: string; Ping: Integer; end; //... function PingThread(Param: PPingThreadParam): Integer; begin try Param.Ping := u_retPing.ICMPPingRTT(u_retPing.DNSNameToIp(Param.IP), Cardinal(1000)); Result := Ord(True); except Result := Ord(False); end; end; //... procedure Test(); var Param: TPingThreadParam; Thread: THandle; ThreadId: DWORD; ThreadExit: DWORD; begin Param.IP := '127.0.0.1'; Thread := THandle( BeginThread(nil, 0, TThreadFunc(@PingThread), @Param, 0, ThreadId)); if Thread <> 0 then try while WaitForSingleObject(Thread, 10) = WAIT_TIMEOUT do Application.ProcessMessages(); if not GetExitCodeThread(Thread, ThreadExit) then ThreadExit := Ord(False); if Boolean(ThreadExit) then ShowMessage('Ping: ' + IntToStr(Param.Ping)) else ShowMessage('PingThread failed'); finally CloseHandle(Thread); end; end; |
Re: Frage zu Threads und Rückgabewerten/Parametern
Funktionuckelt einwandfrei. Was ich mich noch frage: Wieso schreibst du statt "Result := Ord(True) nicht gleich "Result := 1"?
|
Re: Frage zu Threads und Rückgabewerten/Parametern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 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