Einzelnen Beitrag anzeigen

amigage

Registriert seit: 11. Nov 2005
Ort: Leipzig
274 Beiträge
 
Delphi 12 Athens
 
#1

Programm hängt trotz Indy Antifreeze und Threadauslagerung

  Alt 14. Dez 2012, 15: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