全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1711
推到 Plurk!
推到 Facebook!

用MultiThread + TfgActiveDialog,可以解決Firemonkey轉場延遲的問題。

 
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2017-06-08 19:00:41 IP:42.153.xxx.xxx 未訂閱
這是我個人的心得,在我們開發移動應用時,常常會一堆Layout進進出出,問題是假如你在某個Layout要進入時,需要做一些啟始的動作,而這些動作通常做在
Layout的Animation的OnShowFinish裡,如果這些東西太多的,你就會發覺會影響Layout的流暢性。

為了解決這個問題,你需要一個第三方的元件叫TfgActivityDialog,就是一個對話框有一個轉轉圈在裡面的那種,然後再配合MultiThread裡的CreateAnonymousThread,這樣就可以解決Layout卡卡的問題。

希望這些資訊能夠對大家有用。
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2017-06-08 19:40:24 IP:42.153.xxx.xxx 未訂閱
修正,應該是TfgActivityDialog才對。
===================引 用 stacker_liew 文 章===================
這是我個人的心得,在我們開發移動應用時,常常會一堆Layout進進出出,問題是假如你在某個Layout要進入時,需要做一些啟始的動作,而這些動作通常做在
Layout的Animation的OnShowFinish裡,如果這些東西太多的,你就會發覺會影響Layout的流暢性。

為了解決這個問題,你需要一個第三方的元件叫TfgActivityDialog,就是一個對話框有一個轉轉圈在裡面的那種,然後再配合MultiThread裡的CreateAnonymousThread,這樣就可以解決Layout卡卡的問題。

希望這些資訊能夠對大家有用。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2017-06-08 22:23:55 IP:118.160.xxx.xxx 未訂閱
如果大大願意釋出一些寫法讓後進學習的話, 更好的啦!
===================引 用 stacker_liew 文 章===================
修正,應該是TfgActivityDialog才對。
===================引 用 stacker_liew 文 章===================
這是我個人的心得,在我們開發移動應用時,常常會一堆Layout進進出出,問題是假如你在某個Layout要進入時,需要做一些啟始的動作,而這些動作通常做在
Layout的Animation的OnShowFinish裡,如果這些東西太多的,你就會發覺會影響Layout的流暢性。

為了解決這個問題,你需要一個第三方的元件叫TfgActivityDialog,就是一個對話框有一個轉轉圈在裡面的那種,然後再配合MultiThread裡的CreateAnonymousThread,這樣就可以解決Layout卡卡的問題。

希望這些資訊能夠對大家有用。
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2017-06-09 00:40:23 IP:42.153.xxx.xxx 未訂閱
我想放出來,但這個網站很難放原始碼,又限制多多。
不懂怎麼弄。
===================引 用 P.D. 文 章===================
如果大大願意釋出一些寫法讓後進學習的話, 更好的啦!
===================引 用 stacker_liew 文 章===================
修正,應該是TfgActivityDialog才對。
===================引 用 stacker_liew 文 章===================
這是我個人的心得,在我們開發移動應用時,常常會一堆Layout進進出出,問題是假如你在某個Layout要進入時,需要做一些啟始的動作,而這些動作通常做在
Layout的Animation的OnShowFinish裡,如果這些東西太多的,你就會發覺會影響Layout的流暢性。

為了解決這個問題,你需要一個第三方的元件叫TfgActivityDialog,就是一個對話框有一個轉轉圈在裡面的那種,然後再配合MultiThread裡的CreateAnonymousThread,這樣就可以解決Layout卡卡的問題。

希望這些資訊能夠對大家有用。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2017-06-09 22:41:26 IP:118.160.xxx.xxx 未訂閱
應該不難, 如果不好貼, 可以壓縮一個檔, 直上傳下來就可以了
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2017-06-10 11:38:21 IP:42.153.xxx.xxx 未訂閱
好的,我嘗試做個PDF說明檔,其實只是一個觀念而已。
===================引 用 P.D. 文 章===================
應該不難, 如果不好貼, 可以壓縮一個檔, 直上傳下來就可以了
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2017-06-10 21:33:17 IP:118.160.xxx.xxx 未訂閱
先感謝您的無私貢獻~~
===================引 用 stacker_liew 文 章===================
好的,我嘗試做個PDF說明檔,其實只是一個觀念而已。
===================引 用 P.D. 文 章===================
應該不難, 如果不好貼, 可以壓縮一個檔, 直上傳下來就可以了
test28
一般會員


發表:28
回覆:28
積分:16
註冊:2013-08-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2018-05-09 14:03:59 IP:103.224.xxx.xxx 未訂閱
stacker_liew
可否有個簡單的Sample參考,正為此元件困擾,謝謝

---以下是參考原作者的,但不成功,可否指教-------------

procedure TfmMain.imgSearchClick(Sender: TObject);
begin
MyThread := TThread.CreateAnonymousThread(
procedure
begin
try
TThread.Synchronize(nil,
procedure
begin
fgADialog.Message := 'Please, Wait';
fgADialog.Show;
end);

//fgADialog.Message := 'Please, Wait';
//fgADialog.Show;

getData; //存取資料

finally
fgADialog.Hide;
end;

end);
end;
編輯記錄
test28 重新編輯於 2018-05-09 14:43:27, 註解 無‧
test28 重新編輯於 2018-05-09 14:45:00, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2018-05-09 20:34:31 IP:118.169.xxx.xxx 未訂閱
這部份已研究好久, 雖然原作的範例run起來是可行的, 但必須把我們轉場後主程式段都要放在這個執行序上才行, 那這樣程式寫起來根本是一個怪物, 我一直在嘗試把這個元件包成一個function來使用, 但轉場效果都無法出來, 就是我目前最困擾的地方, 在 xe 10.1 之前根本都不需要搞這些, 直接元件呼叫啟動, 關閉就好了, 不知道10.2是動了什麼?
===================引 用 test28 文 章===================
stacker_liew
可否有個簡單的Sample參考,正為此元件困擾,謝謝

---以下是參考原作者的,但不成功,可否指教-------------

procedure TfmMain.imgSearchClick(Sender: TObject);
begin
MyThread := TThread.CreateAnonymousThread(
procedure
begin
try
TThread.Synchronize(nil,
procedure
begin
fgADialog.Message := 'Please, Wait';
fgADialog.Show;
end);

//fgADialog.Message := 'Please, Wait';
//fgADialog.Show;

getData; //存取資料

finally
fgADialog.Hide;
end;

end);
end;
test28
一般會員


發表:28
回覆:28
積分:16
註冊:2013-08-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2018-05-09 23:38:20 IP:103.224.xxx.xxx 未訂閱
我用他的範例也改不過來, 程式都無法繼續下去.
發現作者範例也不是同步顯示
Sleep(1000); //--fgActivityDialog會停留1秒後消失,但是在資料先取得後才出現

不知可否有高手可指教...


procedure TfmMain.Button1Click(Sender: TObject);
begin
if not fgActivityDialog.IsShown then
begin
FActivityDialogThread := TThread.CreateAnonymousThread(procedure
begin
try
TThread.Synchronize(nil, procedure
begin
fgActivityDialog.Message := 'Please, Wait';
fgActivityDialog.Show;

getData; //取得資料
end);

Sleep(1000); //--fgActivityDialog會停留1秒後消失

if TThread.CheckTerminated then
Exit;

finally
if not TThread.CheckTerminated then
TThread.Synchronize(nil, procedure
begin
fgActivityDialog.Hide;
end);
end;
end);
FActivityDialogThread.FreeOnTerminate := False;
FActivityDialogThread.Start;

end;
end;
===================引 用 P.D. 文 章===================
這部份已研究好久, 雖然原作的範例run起來是可行的, 但必須把我們轉場後主程式段都要放在這個執行序上才行, 那這樣程式寫起來根本是一個怪物, 我一直在嘗試把這個元件包成一個function來使用, 但轉場效果都無法出來, 就是我目前最困擾的地方, 在 xe 10.1 之前根本都不需要搞這些, 直接元件呼叫啟動, 關閉就好了, 不知道10.2是動了什麼?
===================引 用 test28 文 章===================
stacker_liew
可否有個簡單的Sample參考,正為此元件困擾,謝謝

---以下是參考原作者的,但不成功,可否指教-------------

procedure TfmMain.imgSearchClick(Sender: TObject);
begin
MyThread := TThread.CreateAnonymousThread(
procedure
begin
try
TThread.Synchronize(nil,
procedure
begin
fgADialog.Message := 'Please, Wait';
fgADialog.Show;
end);

//fgADialog.Message := 'Please, Wait';
//fgADialog.Show;

getData; //存取資料

finally
fgADialog.Hide;
end;

end);
end;
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2018-07-27 04:54:42 IP:60.54.xxx.xxx 未訂閱
我嘗試寫一下我的方法,但我的方法在Berlin下很順暢,只是到Tokyo 10.2.3後會卡卡,後來改用自己的TAniIndicator才不會卡。
有寫過爪哇的同好應該看起來很眼熟。

Synchronize可以試試改用Queue看看。

if not TfgActivityDialog.IsShown then
begin
TThread.CreateAnonymousThread(
procedure
begin
TThread.Synchronize(nil,
procedure
begin
with TfgActivityDialog do
begin
Message := 'Loading...';
Show;
end;
end);
try
...
如果要寫到畫面,記得用TThread.Synchronize...
TThread.Synchronize(nil,
procedure
begin
這裡把要動到畫面的動作。
end);
finally
TThread.Synchronize(nil,
procedure
begin
TfgActivityDialog.Hide;
end);
end;
end).Start;
end;

架構就是 這樣。
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2018-07-27 04:56:45 IP:60.54.xxx.xxx 未訂閱
你會出問題的地方就是沒用到TThread.Synchronize/Queue。
===================引 用 test28 文 章===================
我用他的範例也改不過來, 程式都無法繼續下去.
發現作者範例也不是同步顯示
Sleep(1000); //--fgActivityDialog會停留1秒後消失,但是在資料先取得後才出現

不知可否有高手可指教...


procedure TfmMain.Button1Click(Sender: TObject);
begin
if not fgActivityDialog.IsShown then
begin
FActivityDialogThread := TThread.CreateAnonymousThread(procedure
begin
try
TThread.Synchronize(nil, procedure
begin
fgActivityDialog.Message := 'Please, Wait';
fgActivityDialog.Show;

getData; //取得資料
end);

Sleep(1000); //--fgActivityDialog會停留1秒後消失

if TThread.CheckTerminated then
Exit;

finally
if not TThread.CheckTerminated then
TThread.Synchronize(nil, procedure
begin
fgActivityDialog.Hide;
end);
end;
end);
FActivityDialogThread.FreeOnTerminate := False;
FActivityDialogThread.Start;

end;
end;
===================引 用 P.D. 文 章===================
這部份已研究好久, 雖然原作的範例run起來是可行的, 但必須把我們轉場後主程式段都要放在這個執行序上才行, 那這樣程式寫起來根本是一個怪物, 我一直在嘗試把這個元件包成一個function來使用, 但轉場效果都無法出來, 就是我目前最困擾的地方, 在 xe 10.1 之前根本都不需要搞這些, 直接元件呼叫啟動, 關閉就好了, 不知道10.2是動了什麼?
===================引 用 test28 文 章===================
stacker_liew
可否有個簡單的Sample參考,正為此元件困擾,謝謝

---以下是參考原作者的,但不成功,可否指教-------------

procedure TfmMain.imgSearchClick(Sender: TObject);
begin
MyThread := TThread.CreateAnonymousThread(
procedure
begin
try
TThread.Synchronize(nil,
procedure
begin
fgADialog.Message := 'Please, Wait';
fgADialog.Show;
end);

//fgADialog.Message := 'Please, Wait';
//fgADialog.Show;

getData; //存取資料

finally
fgADialog.Hide;
end;

end);
end;
系統時間:2024-11-23 16:13:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!