![]() |
Versionsnummer abfragen per Thread
Tach auch ...
Ich habe eine Schnellstartleiste programmiert ![]() und möchte nun beim Start eine Versionsüberprüfung durchführen. Dazu nutze ich folgende Funktion:
Delphi-Quellcode:
Das klappt auch soweit sehr gut ...
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 <> 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; 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 |
Re: Versionsnummer abfragen per Thread
Schau dir mal BeginThread / EndThread an.
Damit kann man kleinere Sachen recht einfach aus dem MainThread auslgern. ![]() Schöne Grüße, Jens :hi: |
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. |
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 ![]() 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 |
Re: Versionsnummer abfragen per Thread
Auf meiner Homepage findest du ein ausführlichen Thread-Tutorial.
|
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 ... |
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; |
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:
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.
{ 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; } |
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 <> 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; |
Re: Versionsnummer abfragen per Thread
Ja, so sieht es bsser aus.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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-2025 by Thomas Breitkreuz