![]() |
IcmpClient im Thread
Aloha,
ich hoffe ihr könnt mir bei meinen Problemen helf. Verstehe wirklich nicht, warum das solche Macken macht. Sind meine ersten versuche mit Threads und möchte da jede Sekunde einen Ping abschicken. Allerdings so, dass die weitere Arbeit nicht blockiert - daher der Thread. Wollte mir eigentlich ne Timer-Komonente im Thread erstellen, komme aber nicht ins OnTimer-Ereignis. Also kenne das nur auf einem Form, dass man sagen muss 'Enabled := true' und schon läuft er. Aber der Thread beendet sich dann bei mir. Das Problem konnt ich zwar erstma umgehen, aber habe das nur gemacht, um den Thread am Leben zuhalten. Das größere Problem ist eigentlich, dass ich die Indy-Komponente IdIcmpClient nicht wirklich erzeugen kann. Ich kann alles kompilieren, bekomme aber denn eine Access-Violation... Kann mir jemand sagen warum? Danke im Vorraus! Gruß, Andru
Delphi-Quellcode:
unit uPingSensor;
interface uses Classes, ExtCtrls, IdIcmpClient, fSettings, SysUtils, server_implementation; type PingSensor = class(TThread) private { Private declarations } procedure initPing; procedure getInit; procedure PingTimerTimer(Sender:TObject); procedure IdIcmpClient1Reply(ASender: TComponent; const AReplyStatus: TReplyStatus); procedure UpdatePing; protected procedure Execute; override; end; implementation var PingTimer: TTimer; IdImcpClient1: TIdIcmpClient; pingHost: String; pingPort: Integer; SensorExists: Boolean; { PingSensor } procedure PingSensor.Execute; begin Synchronize(getInit); initPing; while not Terminated do begin PingTimerTimer(self); sleep(1000); end; end; procedure PingSensor.getInit; begin pingHost := server_implementation.configIP; pingPort := server_implementation.configPort; end; procedure PingSensor.initPing; begin try { IdImcpClient1 := IdImcpClient1.Create(nil); //An dieser Stelle knallt es immer... with IdImcpClient1 do begin Host := pingHost; Port := pingPort; ReceiveTimeout := 1500; OnReply := IdIcmpClient1Reply; end; } except PingTimer := TTimer.Create(nil); PingTimer.OnTimer := PingTimerTimer; PingTimer.Interval := 1000; PingTimer.Enabled := true; end; end; procedure PingSensor.PingTimerTimer(Sender:TObject); begin try IdImcpClient1.Ping finally Synchronize(UpdatePing); Execute; end; end; procedure PingSensor.IdIcmpClient1Reply(ASender: TComponent; const AReplyStatus: TReplyStatus); begin SensorExists := AReplyStatus.ReplyStatusType = rsEcho; end; procedure PingSensor.UpdatePing; begin fsettings.SExists := SensorExists; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 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