Internetverbindung prüfen
-
- Beiträge: 423
- Registriert: Di 5. Feb 2008, 12:45
- OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
- CPU-Target: 64Bit
- Kontaktdaten:
Internetverbindung prüfen
Hi,
wie überprüfe ich ob eine Internetverbindung besteht? (Mit synapse wäre es schön, da ich es auch sonst synapse benutze)
Unter Indy (damals in Delphi) war es:
If InternetGetConnectedState(nil, 0) then
Gruß Alexander
wie überprüfe ich ob eine Internetverbindung besteht? (Mit synapse wäre es schön, da ich es auch sonst synapse benutze)
Unter Indy (damals in Delphi) war es:
If InternetGetConnectedState(nil, 0) then
Gruß Alexander
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu
www.alexanderroth.eu
Da wird wahrsch. vor allem auf die Namensauflösung gewartet.alexander hat geschrieben: Wenn ich das Internet nämlich nicht da ist und versuche runterzuladen braucht synapse gaaaaaanz lange....
Da hast du wenig direkten Einfluss.
Ich würde die Socket Geschichte in einem separaten Thread abwickeln.
Den kannst du dann einfach abknallen, wenn du nicht mehr warten willst.
(Das machen Web-Browser ja auch so)
Ich hab dir kurz ne Demo gemacht. Ist nicht so schwer in deinem Fall.
Vergiss nicht unter Linux im Projektsource (project1.lpr) den UseCThreads Switch zu löschen oder diesen dem Compilier mitzugeben.
Vergiss nicht unter Linux im Projektsource (project1.lpr) den UseCThreads Switch zu löschen oder diesen dem Compilier mitzugeben.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, httpsend;
type
{ TForm1 }
TForm1 = class(TForm)
Start: TButton;
Stop: TButton;
Memo1: TMemo;
procedure StartClick(Sender: TObject);
procedure StopClick(Sender: TObject);
private
{ private declarations }
procedure ThreadTerminates(Sender: TObject);
public
{ public declarations }
end;
{ THTTPThread }
THTTPThread=class(TThread)
private
fData: String;
fURL: String;
fHTTP: THTTPSend;
protected
procedure Execute; override;
public
procedure SoftAbort;
procedure HardAbort;
property URL:String read fURL write fURL;
property Data:String read fData;
end;
var
Form1: TForm1;
MyThrd:THTTPThread;
implementation
{ TForm1 }
procedure TForm1.StartClick(Sender: TObject);
begin
MyThrd := THTTPThread.Create(True);
MyThrd.OnTerminate := @ThreadTerminates;
MyThrd.URL := 'http://www.lazarusforum.de';
MyThrd.FreeOnTerminate := true;
MyThrd.Resume;
end;
procedure TForm1.StopClick(Sender: TObject);
begin
MyThrd.HardAbort;
end;
procedure TForm1.ThreadTerminates(Sender: TObject);
begin
Memo1.Text:=MyThrd.Data;
end;
{ THTTPThread }
procedure THTTPThread.Execute;
var Success:boolean;
begin
fHTTP := THTTPSend.Create;
try
Success := fHTTP.HTTPMethod('GET', fURL);
if Success then
begin
fHTTP.Document.Position := 0;
SetString(fData, PChar(fHTTP.Document.Memory), fHTTP.Document.Size);
end;
finally
fHTTP.Free;
end;
end;
procedure THTTPThread.SoftAbort;
begin
Terminate;
fHTTP.Abort; //stop flag setzen
end;
procedure THTTPThread.HardAbort;
begin
SoftAbort;
FreeAndNil(fHTTP);
end;
initialization
{$I unit1.lrs}
end.
-
- Beiträge: 423
- Registriert: Di 5. Feb 2008, 12:45
- OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
- CPU-Target: 64Bit
- Kontaktdaten:
erstmal riesen DANK. Das Demo ist super!
ok das ist interessant...
Jaaa es klappt! (danke für den Hinweis mit UseCThreads (hatte ich ganz vergessen))
hmmm nur stop bringt einen Fehler...
und zwar hier:
EDIT: Ahh es bringt nur einen Fehler wenn es schon fertig ist!
Das ist SUUUUUUPER!
Riesen Dank
EDIT2: Wie kann ich prüfen ob die Überprüfung noch läuft?
(Damit man bei dem Fall nur noch freeannil macht)
hmmm das in StopClick:bringt auch nichts.....
EDIT3: so ganz verstehe ich es nicht...
ok das ist interessant...
Jaaa es klappt! (danke für den Hinweis mit UseCThreads (hatte ich ganz vergessen))
hmmm nur stop bringt einen Fehler...
und zwar hier:
Code: Alles auswählen
fHTTP.Abort; //stop flag setzen
EDIT: Ahh es bringt nur einen Fehler wenn es schon fertig ist!
Das ist SUUUUUUPER!
Riesen Dank
EDIT2: Wie kann ich prüfen ob die Überprüfung noch läuft?
(Damit man bei dem Fall nur noch freeannil macht)
hmmm das in StopClick:
Code: Alles auswählen
if assigned(MyThrd) then
MyThrd.SoftAbort;
EDIT3: so ganz verstehe ich es nicht...
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, HTTPSend;
type
{ TForm1 }
TForm1 = class(TForm)
Start: TButton;
Stop: TButton;
Memo1: TMemo;
procedure StartClick(Sender: TObject);
procedure StopClick(Sender: TObject);
private
{ private declarations }
procedure ThreadTerminates(Sender: TObject);
public
{ public declarations }
end;
{ THTTPThread }
THTTPThread=class(TThread)
private
fData: String;
fURL: String;
fHTTP: THTTPSend;
protected
procedure Execute; override;
public
procedure SoftAbort;
procedure HardAbort;
property URL:String read fURL write fURL;
property Data:String read fData;
end;
var
Form1: TForm1;
MyThrd:THTTPThread;
implementation
{ TForm1 }
procedure TForm1.StartClick(Sender: TObject);
begin
MyThrd := THTTPThread.Create(True);
MyThrd.OnTerminate := @ThreadTerminates;
MyThrd.URL := 'http://www.lazarusforum.de';
MyThrd.FreeOnTerminate := true;
Memo1.Text:='Start'+#13;
MyThrd.Resume;
end;
procedure TForm1.StopClick(Sender: TObject);
begin
if assigned(MyThrd) then
MyThrd.HardAbort;
end;
procedure TForm1.ThreadTerminates(Sender: TObject);
begin
Memo1.Text:=Memo1.Text+MyThrd.Data;
Memo1.Text:=Memo1.Text+#13+'ende';
end;
{ THTTPThread }
procedure THTTPThread.Execute;
var Success:boolean;
begin
fHTTP := THTTPSend.Create;
try
Success := fHTTP.HTTPMethod('GET', fURL);
if Success then
begin
fHTTP.Document.Position := 0;
SetString(fData, PChar(fHTTP.Document.Memory), fHTTP.Document.Size);
end;
finally
fHTTP.Free;
end;
sleep(2000);
end;
procedure THTTPThread.SoftAbort;
begin
Terminate;
fHTTP.Abort; //stop flag setzen
end;
procedure THTTPThread.HardAbort;
begin
SoftAbort;
FreeAndNil(fHTTP);
end;
initialization
{$I unit1.lrs}
end.
Zuletzt geändert von alexander am Sa 17. Mai 2008, 15:02, insgesamt 1-mal geändert.
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu
www.alexanderroth.eu
Naja, das sind dann die Feinheiten..alexander hat geschrieben: EDIT2: Wie kann ich prüfen ob die Überprüfung noch läuft?
(Damit man bei dem Fall nur noch freeannil macht, aber nicht mehr den stop flag setzt, da sonst anscheinend ein fehler kommt)
Du kannst in ThreadTerminates einfach am Schluss MyThrd:=nil setzen.
Dann vor dem Zugriff prüfen:
if Assigned(MyThrd) then MyThrd.HardAbort;
Alternativ kannst du auch den Stop Button nach dem Resume aktivieren und bei ThreadTerminates deaktivieren
Lass dir was einfallen...
-
- Beiträge: 423
- Registriert: Di 5. Feb 2008, 12:45
- OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
- CPU-Target: 64Bit
- Kontaktdaten:
hmmm ok ich habe ein bisschen noch mit sleep rumprobiert um herauszufinden ob der stop button während der ausführung klappt. Sleep scheint aber nicht so gut zu sein...
hmmm ich muss schauen wie ich mache , dass er weiß das das programm beendet ist...
VIELEN DANK
Gruß Alexander
hmmm ich muss schauen wie ich mache , dass er weiß das das programm beendet ist...
VIELEN DANK
Gruß Alexander
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu
www.alexanderroth.eu
-
- Beiträge: 92
- Registriert: So 26. Aug 2007, 20:35
- OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
- CPU-Target: 32Bit
- Wohnort: Helmstedt
- Kontaktdaten:
sleep ist wirklich schlecht.
Besser wäre
//Ersatz für sleep
//sleep hält das gesamte System an
t := time;
repeat
application.processmessages;
until time - t >= strtotime('00:00:05');
Wartet ca. 5 Sekunden und gibt dem PC zwischenzeitlich Zeit zum Arbeiten. Man merkt diese Routine kaum.
Gruß
Peter
Besser wäre
//Ersatz für sleep
//sleep hält das gesamte System an
t := time;
repeat
application.processmessages;
until time - t >= strtotime('00:00:05');
Wartet ca. 5 Sekunden und gibt dem PC zwischenzeitlich Zeit zum Arbeiten. Man merkt diese Routine kaum.
Gruß
Peter
Zeiterfassung, einfach gerechter!