AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Programm hängt trotz Indy Antifreeze und Threadauslagerung
Thema durchsuchen
Ansicht
Themen-Optionen

Programm hängt trotz Indy Antifreeze und Threadauslagerung

Ein Thema von amigage · begonnen am 14. Dez 2012 · letzter Beitrag vom 18. Dez 2012
Antwort Antwort
amigage

Registriert seit: 11. Nov 2005
Ort: Leipzig
270 Beiträge
 
Delphi 11 Alexandria
 
#1

Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 14. Dez 2012, 14:06
Hallo liebe Delphi-Gemeinde,

ich hoffe, ihr könnt mir bei meinem spezifischen Problem helfen. Ich habe mich auch schon im Forum belesen,
leider habe ich keine Lösung finden können, die mein Problem löst.

Einfach gesagt, habe ich eine Form mit einem Ausgabe- und einem Eingabefeld.

Wenn die Form angezeigt wird, wird in der Prozedur  procedure AfterFormShow(var Msg: TMessage); message WM_AFTER_SHOW; der Cursor in das Eingabefeld gestellt und im Hintergrund in einem Thread eine HTTP-Abfrage duchgeführt.
Leider hängt das Programm trotz Auslagerung in einen Thread, weil die Indy-Komponente blockt.
Während auf die Antwort von FHTTP.get() gwartet wird, kann ich nicht sehen, was ich in das Eingabefeld eingebe. Das Fenster wird nicht aktualisiert.

Erst nach Ende der HTTP-Abfrage geht es. Selbst die globale Variable GAntiFreeze hilft mir nicht weiter.

Delphi-Quellcode:
type

  TMyThread = class(TThread)
  private
    TtmpKey : String;
    TtmpSecret: String;

    procedure ThisIsMyFunction;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
  end;

  

{ TMyThread }

constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited;
end;

procedure TMyThread.ThisIsMyFunction;
  result_str : String;
begin
// ...

        result_str := GetFileInfo('', true);
// ...
end;

procedure TMyThread.Execute;
begin
  Synchronize(ThisIsMyFunction);
end;

....

Delphi-Quellcode:
procedure TMainDlg.AfterFormShow(var Msg: TMessage);
var
    DBThread: TMyThread;
begin
  editInput.Setfocus;
  Application.Processmessages;

  DBThread := TMyThread.Create(true);
  try
    DBThread.FreeOnTerminate := True;
    DBThread.Resume;
  except
  end;
  
end;
  

function TMainDlg.GetFileInfo(RemotePath: string; allFiles: boolean = false): String;
var
  listAllFiles : String;
  HTTPURL : String;
const
  FRoot = ''http://www.meinewebseite.de/';
begin
    If GAntiFreeze = NIL then
       GAntiFreeze.Create(nil);
     try
      GAntiFreeze.Active := true;

      HTTPURL := Format(url_metadata, [FRoot, URLEncodeRemotePath(RemotePath)]);
      try
        Result := FHTTP.Get(HTTPURL + '?' + OAuthRequest.GetString);
      except
         on E: EIdSocketError do
            begin
              Result := HTTPURL + SLineBreak + E.Message;
            end;
         on E: EIdHTTPProtocolException do
            begin
              Result := E.ErrorMessage;
            end;
      end;
    finally
      FHTTP.Disconnect;
      if Assigned(FHTTP.IOHandler) then FHTTP.IOHandler.InputBuffer.Clear;
      If Assigned(GAntiFreeze) then FreeAndNil(GAntiFreeze);
    end;

end;

Hätte noch jemand einen Tipp? Habe ich den separaten Thread falsch aufgebaut?

Danke für jede Hilfe.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 14. Dez 2012, 14:10
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  Synchronize(ThisIsMyFunction);
end;
versuche mal:

Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  Synchronize(ThisIsMyFunction);
  sleep(100);
end;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 14. Dez 2012, 14:24
Es bringt nichts einen Thread anzulegen, und dort nur synchronize aufzurufen. Das ist wie ohne Thread zu arbeiten. (Wie kommt man eigentlich immer auf diese besch*** Idee? )
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 14. Dez 2012, 14:35
Dein Thread wartet lediglich darauf das der Hauptthread "ThisIsMyFunktion" abarbeitet.
Das hilft dir nicht weiter. Der Hauptthread arbeitet oder wartet innerhalb von "ThisIsMyFunktion" und die Oberfläche reagiert nicht mehr.

Die Variable GAntiFreeze nicht manuell ändern, verwende statt dessen die Komponente "TIdAntiFreeze".
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 14. Dez 2012, 15:18
Zitat:
Delphi-Quellcode:
    If GAntiFreeze = NIL then
       GAntiFreeze.Create(nil);
Wie erzeugt man nochmal ein Objekt?
Du musst das Objekt erzeugen und in die Variable legen und nicht die Methode Create des (da nil) nicht existierenden Objekts aufrufen und das (theoretisch) neue Objekt nicht speichern...

Zum Problem an sich wurde ja schon genug geschrieben...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
amigage

Registriert seit: 11. Nov 2005
Ort: Leipzig
270 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 17. Dez 2012, 10:18
@sirius + @Blup:
besten Dank, jetzt funktionierts. Eure Aussagen haben mir die Augen geöffnet. Ehrlich gesagt ist es für mich das erste Mal, dass ich mit Threads hantiere. Auch wenn es nur ein simpler Thread ist.

Synchronize(Fktsname) also erst dann aufrufen, wenn der Thread die Arbeit beendet hat, um wieder Zugriff auf den Hauptthread zu bekommen. In meinem Fall die Freigabe von Schaltflächen.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 17. Dez 2012, 15:26
Kleine Bitte am Rande: Seid doch nicht immer so unfreundlich wenn es um das Thema Threads geht. Manchmal hab ich den Eindruck, Threads wären die letzte Bastion elitärer Programmierkunst in der Delphiwelt, welches es bis aufs Messer zu verteidigen gilt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 17. Dez 2012, 15:36
@sirius + @Blup:
besten Dank, jetzt funktionierts. Eure Aussagen haben mir die Augen geöffnet. Ehrlich gesagt ist es für mich das erste Mal, dass ich mit Threads hantiere. Auch wenn es nur ein simpler Thread ist.

Synchronize(Fktsname) also erst dann aufrufen, wenn der Thread die Arbeit beendet hat, um wieder Zugriff auf den Hauptthread zu bekommen. In meinem Fall die Freigabe von Schaltflächen.
Synchronize wird nur dann benötigt, wenn man aus einem Thread auf den Hauptthread zugreifen will. (Egal wann). Der Thread beendet sich auch so.

Wenn der Thread sich beendet, dann ruft der das Event OnTerminate auf.
Somit kann das Freischalten der Buttons oder whatever, was halt beim Beenden des Threads gemacht werden soll, damit aufgerufen werden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 18. Dez 2012, 11:51
Synchronize wird nur dann benötigt, wenn man aus einem Thread auf den Hauptthread zugreifen will. (Egal wann). Der Thread beendet sich auch so.
Nicht ganz richtig:

1. Der Austausch von Daten sollte mit allen anderen Threads sicher gestaltet werden, nicht nur der mit dem Hauptthread. TThread.Synchronize arbeitet lediglich mit/über diesen.

2. Benötigt nur solange, wie man keine anderen Methoden zur Thread-Absicherung verwendet (critical sections, TMultiReadExclusiveWriteSynchronizer o.ä.), aber dazu kommt man später im Umgang mit Threads, Punkt 1 war mir nur wichtig
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.121 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 18. Dez 2012, 12:30
ich hatte ähnlich Probleme beim Arbeiten mit TIdTCPserver.

Die Lösung waren bei mir : TIdSyncronize and TIdNotfy
Threads sind leider auch nicht meine starke Seite und es hat ziemlich lange gedauert bis ich diese Funktionen richtig angewandt habe.

Auf Stackoverflow habe ich hierzu sehr hilfreiche Beispiele gefunden.
  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 00:57 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