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.