用MultiThread + TfgActiveDialog,可以解決Firemonkey轉場延遲的問題。 |
|
stacker_liew
中階會員 發表:59 回覆:168 積分:65 註冊:2004-05-17 發送簡訊給我 |
這是我個人的心得,在我們開發移動應用時,常常會一堆Layout進進出出,問題是假如你在某個Layout要進入時,需要做一些啟始的動作,而這些動作通常做在
Layout的Animation的OnShowFinish裡,如果這些東西太多的,你就會發覺會影響Layout的流暢性。 為了解決這個問題,你需要一個第三方的元件叫TfgActivityDialog,就是一個對話框有一個轉轉圈在裡面的那種,然後再配合MultiThread裡的CreateAnonymousThread,這樣就可以解決Layout卡卡的問題。 希望這些資訊能夠對大家有用。 |
stacker_liew
中階會員 發表:59 回覆:168 積分:65 註冊:2004-05-17 發送簡訊給我 |
修正,應該是TfgActivityDialog才對。
===================引 用 stacker_liew 文 章=================== 這是我個人的心得,在我們開發移動應用時,常常會一堆Layout進進出出,問題是假如你在某個Layout要進入時,需要做一些啟始的動作,而這些動作通常做在 Layout的Animation的OnShowFinish裡,如果這些東西太多的,你就會發覺會影響Layout的流暢性。 為了解決這個問題,你需要一個第三方的元件叫TfgActivityDialog,就是一個對話框有一個轉轉圈在裡面的那種,然後再配合MultiThread裡的CreateAnonymousThread,這樣就可以解決Layout卡卡的問題。 希望這些資訊能夠對大家有用。 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
如果大大願意釋出一些寫法讓後進學習的話, 更好的啦!
===================引 用 stacker_liew 文 章=================== 修正,應該是TfgActivityDialog才對。 ===================引 用 stacker_liew 文 章=================== 這是我個人的心得,在我們開發移動應用時,常常會一堆Layout進進出出,問題是假如你在某個Layout要進入時,需要做一些啟始的動作,而這些動作通常做在 Layout的Animation的OnShowFinish裡,如果這些東西太多的,你就會發覺會影響Layout的流暢性。 為了解決這個問題,你需要一個第三方的元件叫TfgActivityDialog,就是一個對話框有一個轉轉圈在裡面的那種,然後再配合MultiThread裡的CreateAnonymousThread,這樣就可以解決Layout卡卡的問題。 希望這些資訊能夠對大家有用。 |
stacker_liew
中階會員 發表:59 回覆:168 積分:65 註冊:2004-05-17 發送簡訊給我 |
我想放出來,但這個網站很難放原始碼,又限制多多。
不懂怎麼弄。 ===================引 用 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 發送簡訊給我 |
|
stacker_liew
中階會員 發表:59 回覆:168 積分:65 註冊:2004-05-17 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
先感謝您的無私貢獻~~
===================引 用 stacker_liew 文 章=================== 好的,我嘗試做個PDF說明檔,其實只是一個觀念而已。 ===================引 用 P.D. 文 章=================== 應該不難, 如果不好貼, 可以壓縮一個檔, 直上傳下來就可以了 |
test28
一般會員 發表:28 回覆:28 積分:16 註冊:2013-08-26 發送簡訊給我 |
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; |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
這部份已研究好久, 雖然原作的範例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 發送簡訊給我 |
我用他的範例也改不過來, 程式都無法繼續下去.
發現作者範例也不是同步顯示 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 發送簡訊給我 |
我嘗試寫一下我的方法,但我的方法在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 發送簡訊給我 |
你會出問題的地方就是沒用到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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |