2013-12-19 1 views
4

Я использую Delphi XE-5 (FireMonkey Mobile Application)Правильно используя TAniIndicator в FireMonkey мобильного разработчика для ожидания обработки

Я пытаюсь получить TAniIndicator работать, показывая в течение моей долгой обработки. У меня есть TAniIndicator (AniIndi) на моей основной форме, но он не вращается. Он отображается правильно, но не вращается.

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; 

// РЕДАКТИРОВАТЬ НА ОСНОВЕ ОТВЕТА Remy в

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; 

ответ

13

Ваша основная нить должна оставаться отзывчивым к очереди сообщений, пока ваш длительный процесс запущен. Если нет, вы блокируете анимацию (и другие аспекты пользовательского интерфейса) от получения новых сообщений, таких как запросы на рисование и таймеры. Вместо этого вам нужно переместить любую длинную обработку в отдельный поток. Запустите поток, а затем запустите анимацию. Пусть основной поток обрабатывает пользовательский интерфейс, как правило, в то же время. Когда поток завершен, сообщите об этом основному потоку, который может остановить анимацию и завершить любую другую обработку, необходимую для результата потока, если таковой имеется. Например:

type 
    TLoadThread = class(TThread) 
    public 
    Host: string; 
    NamePath: string; 
    Port: Integer; 
    Config: Boolean; 
    constructor Create(const aHost, aNamePath: string; aPort: Integer; aConfig: Boolean); reintroduce; 
    protected 
    procedure Execute; override; 
    end; 

constructor TLoadThread.Create(const aHost, aNamePath: string; aPort: Integer; aConfig: Boolean); 
begin 
    inherited Create(True); 
    FreeOnTerminate := True; 
    Host := aHost; 
    NamePath := aNamePath; 
    Port := aPort; 
    Config := aConfig; 
end; 

procedure TLoadThread.Execute; 
begin 
    //do processing 

    Synchronize(
    procedure 
     //update main form 
    end 
); 

    //do processing 
end; 

var 
    Loading: Boolean = False; 
    zLThread: TLoadThread = nil; 

procedure TfrmMain.FormActivate(Sender: TObject); 
begin 
    zLThread := TLoadThread.Create(Host, NamePath, Port, Config); 
    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; 
+0

Привет Remy, спасибо, позвольте мне дать, что попробовать – JakeSays

+0

Рэми, я отредактировано главный пост. Мне нужно обновить список основных форм во время моей обработки. – JakeSays

+0

Этот поток может использовать метод 'TThread.Synchronize()' для обновления ListBox, когда это необходимо. –

3

Проблема приходят от таймера Внутри TAnimation, случайно Embarcadero добавить глобальную переменную.

Добавьте следующий код в FormCreate процедуры

{$IFDEF IOS} 
AniFrameRate := 10; 
{$ENDIF} 
+1

Это не проблема (выглядит как длительная обработка в основном потоке), но в любом случае это интересное возможное решение. (Я не знал, что глобальный существовал!) –