Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Versionsnummer abfragen per Thread (https://www.delphipraxis.net/61019-versionsnummer-abfragen-per-thread.html)

SittingDuck 15. Jan 2006 23:10


Versionsnummer abfragen per Thread
 
Tach auch ...

Ich habe eine Schnellstartleiste programmiert
http://home.arcor.de/stefan.moka/launcher/Snap1.png
und möchte nun beim Start eine Versionsüberprüfung durchführen.

Dazu nutze ich folgende Funktion:

Delphi-Quellcode:
function LoadURL(URL: String): String;
var IOpen, IURL: HINTERNET; Read: Cardinal; Msg: array[0..4096] of Char;
begin Result := '';
 IOpen := InternetOpen('GetIP', INTERNET_OPEN_TYPE_PRECONFIG, '', '', INTERNET_FLAG_NEED_FILE);
 if IOpen <> nil then try
  IURL := InternetOpenUrl(IOpen, PAnsiChar(URL), nil, 0, INTERNET_FLAG_NO_UI or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD, 0);
  if IURL &lt;&gt; nil then try
   repeat
    FillChar(Msg, SizeOf(Msg), 0);
    if InternetReadFile(IURL, @Msg[0], Pred(SizeOf(Msg)), Read) then Result := Result + Msg else Break;
   until Read = 0;
  finally InternetCloseHandle(IURL); end;
 finally InternetCloseHandle(IOpen); end;
end;
Das klappt auch soweit sehr gut ...
Der Start meines Programmes verzögert sich jedoch weil so
eine Internet-Anfrage, je nach Leitung und Traffic schon mal
ins Stottern kommt.
Jetzt meine Frage: Wie müsste man die Funktion Thread-sicher
verpacken, damit ich, sagen wir nach 5 Sekunden das Ergebnis
aus meinem Hauptprogramm erfragen kann ?
Das Thread-Tutorial habe ich intus ... 2x sogar ... ist jedoch
nicht ganz einfach ... und entwickelt sich komplexer als erwartet.

Besten Dank für Eure Hilfe ...
SittingDuck

jensw_2000 16. Jan 2006 00:10

Re: Versionsnummer abfragen per Thread
 
Schau dir mal BeginThread / EndThread an.
Damit kann man kleinere Sachen recht einfach aus dem MainThread auslgern.

Hier gibts ein bisschen Code.


Schöne Grüße,
Jens
:hi:

chaosben 16. Jan 2006 05:57

Re: Versionsnummer abfragen per Thread
 
Hi SittingDuck! Willkommen in der DelphiPraxis!

Erstmal vorneweg: Der Screenshot deiner Leiste hat mich grafisch erstmal beeindruckt.

Was deine Frage angeht: Ich nutze in einem meiner Projekte den JvHttpURLGrabber. Der macht sich recht gut und hält den Programmablauf nicht auf.

SittingDuck 16. Jan 2006 14:13

Re: Versionsnummer abfragen per Thread
 
Hallo nochmal ...

Erstmal Danke für die nette Begrüßung und für die
schnellen Antworten. Als Gast verfolge ich dieses
Forum schon lange, so daß die Anmeldung als Mit-
glied demnach längst überfällig war. :thumb:

an chaosben: Cool ... Danke fürs Interesse ... ich
meine auch, das der URL Launcher (200KB)
ein Programm ist, was nach 5 Jahren
Entwicklungszeit tatsächlich vorzeigbar wird. :)
Was ich dringend bräuchte wären ein oder mehrere
Betatester ... außer mir selber ... also bedient
Euch ... Feedback always welcome !

Zur Sache: Da ich Minimalist bin möchte ich ungern
'dicke' Jedi-Komponenten in mein Programm rein-
hängen.
Im Prinzip dürfte die Thread-Geschichte
doch gar nicht so schwer sein ... was mir fehlt
ist ein sinnvoller Einstieg, ein Grundgerüst also
an dem ich erkennen kann, wie man z.B. die oben
beschriebene Funktion als seperaten Thread startet.

Vieleicht wäre jemand so nett, die noch fehlenden
Zeilen davor und dahinter zu schreiben. :lol:

Danke schonmal ... SittingDuck

Luckie 16. Jan 2006 14:21

Re: Versionsnummer abfragen per Thread
 
Auf meiner Homepage findest du ein ausführlichen Thread-Tutorial.

SittingDuck 16. Jan 2006 23:13

Re: Versionsnummer abfragen per Thread
 
Hallo ...

Ja Danke für den Hinweis auf das Tutorial ... ich
habe es nun zum 3x gelesen und so langsam wird mir
klar wie der Hase laufen muss ...
Gerade habe ich meinen ersten Thread gestartet ! :thumb:
O.K. er hat nur 'beep;' gemacht, aber was solls ...
trotzdem ein voller Erfolg ...

Oje ... das wird eine lange Nacht ...

SittingDuck 17. Jan 2006 19:41

Re: Versionsnummer abfragen per Thread
 
Tataa ... geschaft !

Es hat sogar richtig Spass gemacht ein Thread anzuschmeissen.
Ganz klassisch gelöst ... war gar nicht sooo schwer. (siehe Source)
Also es läuft ohne Fehler, aber vieleicht könnten ein paar
Thread-Experten nochmal drübergucken ... nur damit kein
Anfänger-Bullshit zwischen den Zeilen hängt. :nerd:

Besten Dank

Delphi-Quellcode:

interface

type
  TGetRemoteVersionThread = class(TThread)
  protected
    procedure Execute; override;
end;

 .
 .
 .

implementation

procedure TForm1.FormCreate(Sender: TObject);
var Thread: TGetRemoteVersionThread;
begin

 Thread := TGetRemoteVersionThread.Create(True);
 Thread.FreeOnTerminate := True;
 Thread.Resume;

 .
 .
 .

end;

procedure TGetRemoteVersionThread.Execute;
var Fv,Rv: string; //FileVersion, RemoteVersion
begin
 try
  if InternetGetConnectedState(nil, 0) then begin
   Rv := LoadURL(BaseURL + 'Launcher.ver'); // Routine siehe oben
   Fv := GetFileVersion(ParamStr(0));
   with Form1.Menu1 do begin
    if Rv = Fv then
    Caption := 'You allready have the latest version (V' + Rv + ')';
    if Rv <> Fv then
    Caption := 'Update and install the latest version V' + Rv;
   end;
  end;
 except end;
end;

Luckie 17. Jan 2006 21:48

Re: Versionsnummer abfragen per Thread
 
Hast du den Thread-Object Wizard benutzt? da steht doch oben als Kommentar, was man tunlichst nicht tun sollte:
Delphi-Quellcode:
{ Important: Methods and properties of objects in VCL or CLX can only be used
  in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure Test.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
Du greifst aber in der Execute-Methode auf ein VCL-Objekt aus dem Hauptthread unsynchronisiert zu, was man eben nicht tun sollte, da die VCL nicht threadsafe ist.

SittingDuck 18. Jan 2006 13:26

Re: Versionsnummer abfragen per Thread
 
OkeeDokee ... Danke für den Hinweis,
aber wer liest schon all das Kleingedruckte ... :oops:

Niemand war überraschter als ich, als der Thread
auf Anfieb lief. Wie auch immer ... jetzt sieht
die Update-Routine so aus:

Könnte man das so gelten lassen ?


Delphi-Quellcode:

interface

type
  TGetRemoteVersionThread = class(TThread)
  private
    procedure UpdateMenuCaption;
  protected
    procedure Execute; override;
  public
    Fv, Rv: string; //FileVersion, RemoteVersion
end;

type
  TForm1 = class(TForm)

 .
 .
 .

implementation

function LoadURL(URL: String): String;
var IOpen, IURL: HINTERNET; Read: Cardinal; Msg: array[0..4096] of Char;
begin Result := '';
IOpen := InternetOpen('GetIP', INTERNET_OPEN_TYPE_PRECONFIG, '', '', INTERNET_FLAG_NEED_FILE);
if IOpen <> nil then try
  IURL := InternetOpenUrl(IOpen, PAnsiChar(URL), nil, 0, INTERNET_FLAG_NO_UI or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD, 0);
  if IURL &lt;&gt; nil then try
   repeat
    FillChar(Msg, SizeOf(Msg), 0);
    if InternetReadFile(IURL, @Msg[0], Pred(SizeOf(Msg)), Read) then Result := Result + Msg else Break;
   until Read = 0;
  finally InternetCloseHandle(IURL); end;
finally InternetCloseHandle(IOpen); end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var Thread: TGetRemoteVersionThread;
begin

 Thread := TGetRemoteVersionThread.Create(True);
 Thread.FreeOnTerminate := True;
 Thread.Resume;

 .
 .
 .

end;


procedure TGetRemoteVersionThread.UpdateMenuCaption;
begin
 with Form1.Menu03 do
 if Rv = Fv then Caption := 'You allready have' else
                 Caption := 'Update and install';
 Caption := Caption + ' the latest version V' + Rv;
end;


procedure TGetRemoteVersionThread.Execute;
begin
 try
  if InternetGetConnectedState(nil, 0) then begin
   Rv := LoadURL(BaseURL + 'Launcher.ver');
   Fv := GetFileVersion(ParamStr(0));
   Synchronize(UpdateMenuCaption);
  end;
 except end;
end;

Luckie 18. Jan 2006 16:45

Re: Versionsnummer abfragen per Thread
 
Ja, so sieht es bsser aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz