![]() |
Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
Moin Moin
ich lade mittels eines Timers (einstellbar) eine kleine Datei (Bild) jede Sekunde runter das ganze funktioniert auch ohne Probleme mit IdHTTP1.Get
Delphi-Quellcode:
jetzt habe ich allerdings noch 2 Probleme die mir nicht gefallen
begin
DestFile := ExtractFilePath(ParamStr(0)) + 'temp.jpg'; Image1.Picture := nil; stream := TFileStream.Create(DestFile, fmCreate); try IdHTTP1.Get(SourceFile, stream); except Timer2.Enabled := false; ShowMessage('Verbindungsfehler!'); end; stream.Free; if Timer2.Enabled then Image1.Picture.LoadFromFile(PChar(DestFile)); end 1. Wären des kurzen Downloads ist die Anwendung immer "blockiert" d.h. wenn ich z.b. mit der Maus über einen Button fahre stockt der "hover-effekt" auch wenn ich irgendwas anklicke geschieht das mit leichter verzögerung 2. das nächste problem ist ähnlich da wenn die datei nicht geladen werden kann die anwendung ca 15 sekunden eingefroren ist bis der verbindungsfehler kommt Wie kann man das ganze jetzt umgehen / fixen das die Anwenung nicht so zögerlich reagiert habe es mal testweise auch mit TIdAntiFreeze versucht aber auch das bringt nicht den erfolg, vermutlich weil es kein direktes einfrieren ist |
Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
Vermutlich ist die Get-Methode thread-blocking, macht also keinen neuen Thread auf und kehrt erst zurück, wenn der Download fertig ist. Das kannst du abstellen, indem du selbst einen parallelen Thread abzweigst und in diesem die Datei runterlädtst, während der andere Thread sich um das normale Weiterlaufen des Programmen kümmert.
Mach dich einfach mal über [dp="Thread"]Threads[/dp] schlau, inbesondere in den Varianten ![]() ![]() |
Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
ok danke erstmal für die Info (auch im anderen board ;)
hoffe das bekomem ich jetzt nach der nachtschicht noch alles im kopf rein, also lesen lernen probieren usw EDIT: denke mal das ist hier was interessantes zu thema threads was ich gefunden habe: ![]() thx da schon mal an Luckie |
Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
OK erstmal habe ich hier noch weitere Infos gefunden:
![]() jetzt mal zu dem was ich versucht habe Datei --> Neu --> Thread-Objekt Als Name habe ich bildupdate vergeben und das ganze schaut dann als Unit3 so aus:
Delphi-Quellcode:
in der Unit1, der HauptUnit schaut die Prozedur zum aufrufen so aus:
unit Unit3;
interface uses Classes; type bildupdate = class(TThread) private { Private-Deklarationen } protected procedure Execute; override; end; implementation procedure bildupdate.Execute; begin if internal_loop = 0 then begin DestFile := ExtractFilePath(ParamStr(0)) + 'temp.jpg'; Image1.Picture := nil; stream := TFileStream.Create(DestFile, fmCreate); try IdHTTP1.Get(SourceFile, stream); except Timer2.Enabled := false; ShowMessage('Verbindungsfehler!'); end; stream.Free; if Timer2.Enabled then Image1.Picture.LoadFromFile(PChar(DestFile)); end else begin // Lokal --> nicht über Internet AviCap.CopyToClipboard; Image1.picture := nil; Image1.Picture.Bitmap.Assign(Clipboard); end; end; end.
Delphi-Quellcode:
in der Unit1 der HauptUnit habe ich Unit3 mit der ThredSache in den uses mit eingebunden
procedure TForm1.Button2Click(Sender: TObject);
var SourceFile, DestFile : string; stream: TFileStream; var Thread: bildupdate; begin if dieurl = '' then exit else SourceFile := dieurl; if dieurl = '' then exit; if Timer2.Enabled = false then Timer2.Enabled := True; ToolButton9.Enabled := true; ToolButton10.Enabled := true; // Thread-Bereich Thread := bildupdate.Create(True); Thread.FreeOnTerminate := True; Thread.Terminate; end; das Problem ist jetzt das beim compilen z.b. die globale variabel "internal_loop" nicht bekannt ist un dich in der Unit3 nicht noch die Unit1 mit einbinden kann wie bekomme ich das denn jetzt hin das dort auch alle variabeln eingabefelder usw bekannt sind ? |
Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
Du könntest z.B. die Hauptunit im implementation-Teil des Threads einhängen. Denk aber dran, dass Du eine Veränderung auf dem Formular, bzw. an Variablen des Hauptformulars, nur über die Synchronize-Methode der TThread-Klasse vornehmen darfst. Schau dazu mal in die OH. Ich nehme an, "internal_loop" ist eine globale Variable im Hauptformular? Ist sie ein Attribut des Formulars oder global deklariert? Du musst aufpassen, wenn Du aus Threads in globale Variablen schreibst. Denk dran, dass ein Thread parallel zur eigenen Anwendung abläuft. Stell dir das so vor, dass 2 Anwendungen gleichzeitig mit der gleichen Variable arbeiten. Da kann es u.U. zu falschen Werten, bzw. ungewollten Werten kommen.
Zudem sehe ich in Deinem Hauptformular, dass der Thread nach dem erstellen direkt wieder terminiert wird. Wieso? Das Termiante kann imho raus. Die Execute-Methode des Threads läuft durch, und wenn sie fertig ist, dann wird der Thread beendet. Gruß Christian |
Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
"internal_loop" ist eine globale integervariabel
danke erstmal für die hilfe, nun bin ich schon nen schritt weiter :) allerdings funktioniert das ganze jetzt nicht (keine fehlerausgabe) habe schon ein ShowMessage('test!');// eingebaut und auch das wird nicht angezeigt hier die Unit3 mit dem Thread:
Delphi-Quellcode:
also Unit1 ist jetzt in den implementationen drinn und die Formularfelder wie Image1 spreche ich mit Form1.Image1 an (hoffe das ist so richtig)
unit Unit3;
interface uses Classes,clipbrd,SysUtils,Dialogs; type bildupdate = class(TThread) private { Private-Deklarationen } protected procedure Execute; override; end; implementation uses Unit1; procedure bildupdate.Execute; begin ShowMessage('test!'); if internal_loop = 0 then begin DestFile := ExtractFilePath(ParamStr(0)) + 'temp.jpg'; Form1.Image1.Picture := nil; stream := TFileStream.Create(DestFile, fmCreate); try Form1.IdHTTP1.Get(SourceFile, stream); except Form1.Timer2.Enabled := false; ShowMessage('Verbindungsfehler!'); end; stream.Free; if Form1.Timer2.Enabled then Form1.Image1.Picture.LoadFromFile(PChar(DestFile)); end else begin // Lokal --> nicht über Internet Synchronize-Methode Form1.AviCap.CopyToClipboard; Form1.Image1.picture := nil; Form1.Image1.Picture.Bitmap.Assign(Clipboard); end; end; end. die Prozedur in der Unit1 schaut jetzzt so aus:
Delphi-Quellcode:
die beiden vars:
procedure TForm1.Button2Click(Sender: TObject);
var Thread: bildupdate; begin if dieurl = '' then exit else SourceFile := dieurl; if dieurl = '' then exit; if Timer2.Enabled = false then Timer2.Enabled := True; ToolButton9.Enabled := true; ToolButton10.Enabled := true; // Thread-Bereich Thread := bildupdate.Create(true); Thread.FreeOnTerminate := True; end; var SourceFile, DestFile : string; var stream: TFileStream; mußte ich auch global definieren Wo könnte jetzt der Fehler liegen ? Also außer zwischen meinen Ohren ;) |
Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
Liste der Anhänge anzeigen (Anzahl: 2)
Jetz habe ich gerade etwas getestet und Thread.Resume; mit eingefügt
Thread := bildupdate.Create(true); Thread.Resume; Thread.FreeOnTerminate := True; danach wurde das bild auch angezeigt, allerdings als ich die verbindung zum bild getrennt habe bekam ich diese meldungen von delphi, ich vermute mal das Thread.Resume; nicht korrekt war |
Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
mal vorsichtig push da ich immer noch nicht weiter bin ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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