Richtig mit TAniIndicator in firemonkey mobile dev, für warten, für die Verarbeitung
Ich bin mit Delphi XE-5 (Mobile Firemonkey-Anwendung)
Ich versuche, das TAniIndicator zu arbeiten, durch die Anzeige während meiner lange die Bearbeitung.
Ich habe eine TAniIndicator (AniIndi) auf meinem main-form, aber nicht drehen. Es zeigt richtig, aber nicht drehen.
begin
Loading:= True;
AniIndi.Visible:= True;
AniIndi.Enabled:= True;
UpdateAll;
Application.ProcessMessages;
//do my processsing here
Loading:= False;
AniIndi.Enabled:= False;
AniIndi.Visible:= False;
UpdateAll;
Application.ProcessMessages;
end;
//EDIT BASIERT AUF REMYS ANTWORT
TLoadThread = class(TThread)
public
Config: Boolean;
constructor Create(const aConfig: Boolean); reintroduce;
protected
procedure DoProcessing;
procedure Execute; Override;
end;
var
loading: Boolean = false;
zLThread: TLoadThread = nil;
constructor TLoadThread.Create(const aConfig: Boolean);
begin
inherited Create(true);
Config:= aConfig;
end;
procedure TLoadThread.DoProcessing;
var
begin
//do processing here and update main form
end;
procedure TLoadThread.Execute;
begin
FreeOnTerminate:= true;
Synchronize(DoProcessing);
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
zLThread:= TLoadThread.Create(True, Host, NamePath, Config, Port);
zLThread.OnTerminate := ThreadTerminated;
zLThread.Start;
Loading := True;
AniIndi.Visible := True;
AniIndi.Enabled := True;
UpdateAll;
end;
procedure TfrmMain.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
AniIndi.Enabled := False;
AniIndi.Visible := False;
UpdateAll;
end;
InformationsquelleAutor JakeSays | 2013-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Haupt-thread braucht, um zu bleiben in Reaktion auf die message queue, während Ihr langer Prozess ausgeführt wird. Wenn nicht, blockieren, die animation (und andere Aspekte der Benutzeroberfläche) keine neue Nachrichten empfangen werden, wie malen, Anfragen und Timer benachrichtigt. Sie brauchen, um eine lange Bearbeitung zu einem separaten thread statt. Starten Sie den thread auf und dann startet die animation. Lassen Sie den Haupt-thread-handle UI, die normalerweise in der Zwischenzeit. Wenn der thread fertig ist, teilt er der Haupt-thread, die können dann stoppen Sie die animation, und beenden Sie alle anderen, die Verarbeitung muss auf das Ergebnis des Threads, wenn überhaupt. Zum Beispiel:
Remy, ich dited der main-post. Muss ich zum aktualisieren der wichtigsten form der listbox während meiner Bearbeitung.
Den thread können die
TThread.Synchronize()
Methode zum aktualisieren der ListBox, wenn nötig.Danke! Mir fehlte das h im Synchronisieren. Ich werde zu aktualisieren meinem Beispiel arbeiten Sie in einer minute - danke für die Hilfe
Sie sind mit
Synchronize()
zu tun alle Ihrer Verarbeitung in der main-thread, damit Sieg über den Zweck der Verwendung ein thread an alle. VerwendenSynchronize()
zu aktualisieren Sie einfach die ListBox selbst, aber der rest der Verarbeitung im thread statt.InformationsquelleAutor Remy Lebeau
Das problem kommt aus der timer Innerhalb der TAnimation, durch Zufall Embarcadero fügen Sie eine Globale variable.
Fügen Sie den folgenden code in der FormCreate-Prozedur
InformationsquelleAutor David Drouin