| Autor |
Beitrag |
the_immortal
      
Beiträge: 78
|
Verfasst: Do 13.10.05 11:51
Mit der folgenden Funktion finde ich die zu einem bestimmten Host gehörende IP:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function TForm1.gethostip(host: String): String; var SockAddr: TSockAddrIn; begin
SockAddr.sin_addr.S_addr := Longint(PLongint(gethostbyname(PChar(host))^.h_addr^)^); result := inet_ntoa(SockAddr.sin_addr);
end; |
Das funktionier eigentlich auch ganz gut bis ein host verwendet wird, der nicht existiert dann erhalte ich eine AccessViolation, ich habe es mit try versucht abzufangen funktioniert jedoch nicht.
Bin ein Delphi-Noob und habe seit 1 Jahr nicht mehr Delphi programmiert ;(, wie kann ich den Error abfangen?
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 11:59
mit der folgenden Funktion schaue ich dann ob der Port einer bestimmten IP online ist oder offline:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function TForm1.online(host, port: String): Boolean; begin tcpClient1.RemoteHost := host; tcpClient1.RemotePort := port; tcpClient1.Active := true;
if tcpClient1.Connected = true then begin result := true; end else begin result := false; end;
tcpClient1.Active := false;
end; |
jedoch jedes mal bei der abfrage bleibt das Form kurz stehen, ist also lahmgelegt.
Wie kann man das ändern?
PS: Mir ist aufgefallen, das es nur ruckelt / kurz stoppt, wenn der jeweilige Port des Hosts offline, respektiv nicht offen ist! Das Ruckeln ist nur ganz leicht wenn der Port offen ist!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.10.05 12:53
Moin!
Mach einen Thread draus.  Tutorials gibt´s dazu genug hier.
cu
Narses
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 13:03
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 13.10.05 13:05
the_immortal hat folgendes geschrieben: | | Das funktionier eigentlich auch ganz gut bis ein host verwendet wird, der nicht existiert dann erhalte ich eine AccessViolation, ich habe es mit try versucht abzufangen funktioniert jedoch nicht. |
nimm die funktion aus meiner RETPING unit, die funktioniert.
bei SUBNET SCANNER siehst du, wie man das mit einem thread einfach macht.
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.10.05 13:06
Moin!
Du hast gefragt, wie man das Blockieren des Hauptthreads ändern kann; nun, eben mit einem weiteren Thread. Was hilft da nicht weiter? Mach Luckies Thread-Tut, dann weist du, wie man das coden kann.
cu
Narses
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 14:21
Narses hat folgendes geschrieben: | Moin!
Du hast gefragt, wie man das Blockieren des Hauptthreads ändern kann; nun, eben mit einem weiteren Thread. Was hilft da nicht weiter? Mach Luckies Thread-Tut, dann weist du, wie man das coden kann.
cu
Narses |
sorry, hab dich total falsch verstanden, ich dachte an ein Forum-Thread  , sry!
PS: Merci für den Tipp
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 15:28
Ich habe jetzt ein TThread Objekt erstellt, in welchem ich die Abfragen mache.
Mit einem Timer rufe ich das Thread wie folgt alle 5 sekunden auf
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.tmrDBTimer(Sender: TObject); var Q : thrCheck; begin
Q := thrCheck.Create(false); Q.FreeOnTerminate := true;
end; |
Es scheint genauso zu funktionieren wie zuvor, leider wird die Applikation immer noch kurz unterbrochen, vielleicht habe ich etwas übersehen, bezüglich des Threads ???
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.10.05 15:33
Moin!
Und wenn du noch den Thread-Code hier reinstellst, könnte man sogar was dazu sagen...
cu
Narses
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 15:39
zu Befehl:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure thrCheck.Execute; begin
Synchronize(DoIt);
end;
procedure thrCheck.DoIt; var ipHost1, ipHost2: String; begin
ipHost1 := gethostip2(strHost1); ipHost2 := gethostip2(strHost2);
end;
function thrCheck.gethostip2(host: String): String; var SockAddr: TSockAddrIn; HostEnt: PHostEnt; begin
HostEnt := gethostbyname(PChar(host)); if HostEnt <> nil then begin SockAddr.sin_addr.S_addr := Longint(PLongint(HostEnt^.h_addr^)^); result := inet_ntoa(SockAddr.sin_addr); end else begin result := 'error'; end; end; |
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.10.05 16:00
Moin!
Wenn du den Code mit Synchronize() ausführst, dann landest du doch wieder im Haupt-Thread... dann nutzt dir der Thread ja wieder nix mehr.
cu
Narses
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 16:02
Narses hat folgendes geschrieben: | Moin!
Wenn du den Code mit Synchronize() ausführst, dann landest du doch wieder im Haupt-Thread... dann nutzt dir der Thread ja wieder nix mehr.
cu
Narses |
was müsste ich demnach tun?
einfach DoIt;?
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.10.05 16:13
Moin!
Warum nicht den Code direkt ins Execute? Synchronize() brauchst du nur dann, wenn du VCL-Kompos im Thread befingern willst.
cu
Narses
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 16:14
OK, es funktioniert nun!
Jedoch habe ich bemerkt, dass es machmal länger als 5sec dauert bis er den Thread dann auch wirklich ausgeführt hat!
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 16:21
Narses hat folgendes geschrieben: | Moin!
Warum nicht den Code direkt ins Execute? Synchronize() brauchst du nur dann, wenn du VCL-Kompos im Thread befingern willst.
cu
Narses |
Mache ich doch auch indem ich auf ein Shape zugreiffe? Oder ist ein Shape keine VCL-Komponente?
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.10.05 16:23
Moin!
In dem Code oben kommt kein Shape vor, oder ich bin blind.
Aber wenn du tatsächlich ein Shape anfasst (ja, ist VCL), dann solltest du nur den Zugriff auf die Shape-Eigenschaften per Synchronize() kapseln, nicht die eigentliche Aufgabe.
cu
Narses
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 16:30
Beim Synchronize wird das "Zeugs" im Haupt-Thread ausgeführt ist das richtig?
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.10.05 16:38
Moin!
Ich weiss nicht genau, ob es wirklich IM Hauptthread ausgeführt wird (glaube ich nicht), sondern es wird abgewartet, bis sich der Hauptthread im MessageLoop befindet. Schau halt in die OH, da steht IMHO was dazu.
cu
Narses
|
|
the_immortal 
      
Beiträge: 78
|
Verfasst: Do 13.10.05 16:43
Um den Port zu scannen verwende ich die folgenden paar Zeilen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| tcpClient1.RemoteHost := host; tcpClient1.RemotePort := port; tcpClient1.Active := true;
if tcpClient1.Connected = true then begin result := true; end else begin result := false; end;
tcpClient1.Active := false; tcpClient1.Close; |
Wenn ich den Port öffne und ich die Funktion ausführe geht es relativ schnell bis er merkt, das er offen ist, jedoch wenn ich den Port schliesse, dauert es eine Ewigkeit. Starte ich das Programm mit der ich die Funktion aufrufe neu ist der Port sofort als offline ersichtlich (der Port ist wirklich geschlossen, irgenwie scheinen meine Zeilen nicht ganz auszureichen um das zu merken  )
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 13.10.05 16:45
wärst du meinen links gefolgt hättest jetzt schon eine funktionierende anwendung und müsstest dich nicht mit dem tthread objekt rumärgern 
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|