Autor Beitrag
the_immortal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 11:51 
Mit der folgenden Funktion finde ich die zu einem bestimmten Host gehörende IP:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 11:59 
mit der folgenden Funktion schaue ich dann ob der Port einer bestimmten IP online ist oder offline:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.10.05 12:53 
Moin!

Mach einen Thread draus. :wink: Tutorials gibt´s dazu genug hier.

cu
Narses
the_immortal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 13:03 
user profile iconNarses hat folgendes geschrieben:
Moin!

Mach einen Thread draus. :wink: Tutorials gibt´s dazu genug hier.

cu
Narses


Das hilft mir auch nicht wirklich weiter :(
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Do 13.10.05 13:05 
user profile iconthe_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 Suche in: Delphi-Forum RETPING unit, die funktioniert.
bei Suche in: Delphi-Forum 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 14:21 
user profile iconNarses 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 :P, sry!


PS: Merci für den Tipp
the_immortal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.10.05 15:33 
Moin!

Und wenn du noch den Thread-Code hier reinstellst, könnte man sogar was dazu sagen... :roll: :wink:

cu
Narses
the_immortal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 15:39 
zu Befehl:

ausblenden volle Höhe Delphi-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 16:02 
user profile iconNarses 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 16:21 
user profile iconNarses 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.10.05 16:23 
Moin!

In dem Code oben kommt kein Shape vor, oder ich bin blind. :wink:

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. :wink:

cu
Narses
the_immortal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 16:30 
Beim Synchronize wird das "Zeugs" im Haupt-Thread ausgeführt ist das richtig?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 13.10.05 16:43 
Um den Port zu scannen verwende ich die folgenden paar Zeilen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 :roll:

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...