![]() |
Ping Prozedur friert ein. Hilfe!
Hallo, ich hab ein Problem und verstehe das gerade überhaupt nicht:
Also, ich habe mir da mal eine Ping-Prozedur aus dem Web gezogen (ich glaub von reytn oder so von delphi-forum.de) und ein wenig verändert und sie funktioniert gut. Aber nach etwa drei Minuten friert mir das Programm ein und das ist nicht schön, weil der Ping nur ein kleiner Teil des ganzen ist! Freue mich auf eure Hilfe! Wer eine Ping-Prozedur sucht, freut sich bestimmt auch. Hier der Quelltext:
Delphi-Quellcode:
CONST
WM_PINGCOMPLETE = WM_USER + 1337; ... var Form1: TForm1; r:integer; ... function GetRTTAndHopCount(DestIpAddress:DWORD; HopCount :pointer; MaxHops: DWORD; RTT : pointer):boolean; stdcall; external 'iphlpapi.dll'; var speed: integer; procedure pingthread(host:pchar); stdcall; function GetIPAddress(const HostName: string): string; var R: Integer; WSAData: TWSAData; HostEnt: PHostEnt; Host: string; SockAddr: TSockAddrIn; begin Result := ''; R := WSAStartup($0101, WSAData); if R = 0 then try Host := HostName; if Host = '' then begin SetLength(Host, MAX_PATH); GetHostName(@Host[1], MAX_PATH); end; HostEnt := GetHostByName(@Host[1]); if HostEnt <> nil then begin SockAddr.sin_addr.S_addr := Longint(PLongint(HostEnt^.h_addr_list^)^); Result := inet_ntoa(SockAddr.sin_addr); end; finally WSACleanup; end; end; var ip, RTT, hopcount: DWORD; ipAD: string; begin hopCount:=0; RTT:=0; ipAd := GetIPAddress(host); ip := inet_addr(@ipAd[1]); if not GetRTTAndHopCount(ip, @hopCount, 30, @RTT) then postmessage(Form1.Handle,WM_PINGCOMPLETE,ip,0) else postmessage(Form1.Handle,WM_PINGCOMPLETE,ip,rtt+1); end; procedure TForm1.WMPINGCOMPLETE(var msg: tmessage); function IPAddrToName(IPAddr: string): string; var SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData; begin WSAStartup($101, WSAData); SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr)); HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); if HostEnt <> nil then Result := StrPas(Hostent^.h_name) else Result := 'Router'; end; begin if msg.LParam = 0 then begin StringGrid.RowCount := StringGrid.RowCount +1; StringGrid.Cells[0,r] := inet_ntoa(in_addr(msg.WParam)); StringGrid.Cells[1,r] := IPAddrToName(inet_ntoa(in_addr(msg.WParam))); StringGrid.Cells[2,r] := 'offline'; end else begin StringGrid.RowCount := StringGrid.RowCount +1; speed := (msg.LParam * 100) div (msg.LParam * msg.LParam); StringGrid.Cells[0,r] := inet_ntoa(in_addr(msg.WParam)); StringGrid.Cells[1,r] := IPAddrToName(inet_ntoa(in_addr(msg.WParam))); StringGrid.Cells[2,r] := inttostr(speed) + ' MBit/s (' + inttostr(msg.lparam) + ' ms)'; end; r := r+1; end; ... procedure TForm1.ButtonClick(Sender: TObject); var strkind, host: string; tid: cardinal; buffer: array [0..255] of char; begin StringGrid.RowCount := 1; r := 0; for i := 1 to 255 do begin host := '192.168.1.' + inttostr(i); StatusBar.Panels[0].Text := 'ping '+host; createthread(nil,0,@pingthread,@host[1],0,tid); application.ProcessMessages; sleep(30); end; end; |
Re: Ping Prozedur friert ein. Hilfe!
Hab keine Ahnung, aber mit Spleep(30) und i=1 to 255 friert Dein Programm möglicherweise ein.
Von Threads habe ich auch keine Ahnung, aber erstellst Du nicht 255 Threads und machst ein Sleep? Ich glaube, Du brauchst ein Delay?! :gruebel: Zum besseren Verständnis: Ich beziehe mich auf procedure TForm1.ButtonClick(Sender: TObject); |
Re: Ping Prozedur friert ein. Hilfe!
nein, er muss die prozedur "pingthread" nur auch in einen _thread_ packen... :lol:
(WM_USER + 1337 - da war wohl jemand von sich überzeugt) |
Re: Ping Prozedur friert ein. Hilfe!
Zum einen bin ich ein Anfänger und zum anderen: Die Konstante WM_User war schon dabei, ich hab allerdings nie geguckt, was es damit auf sich hat, die ist ja eigentlich total sinnlos!
Der Ping funktioniert, aber etwa 5min nachdem ich ihn ausgeführt habe friert er ein! Was ein Delay ist, weiß ich leider auch nicht und könnt ihr mir vielleicht erklären wie ich Zitat:
Vielen Dank für eure Antworten. Ich hoffe, ihr erklärt mir noch eure Begrifflichkeiten. Grüße LAWn-M0W3R (Was sollte WM_USER + 1337 eigentlich heißen?) |
Re: Ping Prozedur friert ein. Hilfe!
Zitat:
Zitat:
|
Re: Ping Prozedur friert ein. Hilfe!
Warum die Ping Prozedur überhaupt in einen Thread auslagern?
Die hat ja gar keine Schleifen, in denen sie sich stundenlang aufhalten könnte. Meiner Meinung ist das asynchrone Ausführen hier überflüssig. Eine einfache Funktion mit Rückgabewert wäre doch klasse. Und wenn währenddessen das UI noch bedienbar bleiben soll, dann lagert man halt die gesamte Button.Click Methode in einen Thread aus. So wie ich das sehe, werden (bzw. sollen) hier wirklich 255 Threads kreiert. Totaler Overkill... Gruß, Thomas PS: wenn das mal nicht ein N3tzw3rk-$(4N wird ... :-D PPS: Macht mit Windows XP und Firewall gar keinen Spaß, weil die nicht auf Ping antworten |
Re: Ping Prozedur friert ein. Hilfe!
Zitat:
Zitat:
|
Re: Ping Prozedur friert ein. Hilfe!
OK, das ist ja schon mal interessant, aber wie mache ich jetzt alles in einen Thread??? (Ich bin doch Anfänger!)
|
Re: Ping Prozedur friert ein. Hilfe!
Sieh dir doch mal das
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 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 by Thomas Breitkreuz