AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

Offene Frage von "Nisbo"
Ein Thema von Nisbo · begonnen am 25. Apr 2005 · letzter Beitrag vom 28. Apr 2005
Antwort Antwort
Nisbo

Registriert seit: 10. Mär 2005
191 Beiträge
 
Delphi 5 Standard
 
#1

Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 25. Apr 2005, 13:29
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:
    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
jetzt habe ich allerdings noch 2 Probleme die mir nicht gefallen

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
Jens
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#2

Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 25. Apr 2005, 15:18
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 Hier im Forum suchenTThread und Hier im Forum suchenCreateThread.
  Mit Zitat antworten Zitat
Nisbo

Registriert seit: 10. Mär 2005
191 Beiträge
 
Delphi 5 Standard
 
#3

Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 25. Apr 2005, 15:25
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: http://tutorials.luckie-online.de/
thx da schon mal an Luckie
Jens
  Mit Zitat antworten Zitat
Nisbo

Registriert seit: 10. Mär 2005
191 Beiträge
 
Delphi 5 Standard
 
#4

Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 25. Apr 2005, 17:36
OK erstmal habe ich hier noch weitere Infos gefunden:
http://www.dev-center.de/index.php?c...ing&printing=1

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:
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.
in der Unit1, der HauptUnit schaut die Prozedur zum aufrufen so aus:
Delphi-Quellcode:
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;
in der Unit1 der HauptUnit habe ich Unit3 mit der ThredSache in den uses mit eingebunden
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 ?
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Bowler
Bowler

Registriert seit: 8. Sep 2003
Ort: Bochum
148 Beiträge
 
Delphi XE7 Enterprise
 
#5

Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 26. Apr 2005, 09:40
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
Christian Rüsken
  Mit Zitat antworten Zitat
Nisbo

Registriert seit: 10. Mär 2005
191 Beiträge
 
Delphi 5 Standard
 
#6

Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 26. Apr 2005, 16:58
"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:
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.
also Unit1 ist jetzt in den implementationen drinn und die Formularfelder wie Image1 spreche ich mit Form1.Image1 an (hoffe das ist so richtig)

die Prozedur in der Unit1 schaut jetzzt so aus:

Delphi-Quellcode:
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;
die beiden vars:

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
Jens
  Mit Zitat antworten Zitat
Nisbo

Registriert seit: 10. Mär 2005
191 Beiträge
 
Delphi 5 Standard
 
#7

Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 26. Apr 2005, 17:57
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
Miniaturansicht angehängter Grafiken
fehler2_430.gif   fehler1_174.gif  
Jens
  Mit Zitat antworten Zitat
Nisbo

Registriert seit: 10. Mär 2005
191 Beiträge
 
Delphi 5 Standard
 
#8

Re: Delphi 5 Standard + Indy 10 --> IdHTTP1.Get Problem

  Alt 28. Apr 2005, 16:55
mal vorsichtig push da ich immer noch nicht weiter bin
Jens
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 Uhr.
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