線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2749
推到 Plurk!
推到 Facebook!

一支執行緒的Dialog

 
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2018-03-18 12:50:41 IP:118.169.xxx.xxx 未訂閱
自序
這是我一直想要做的 Dialog, 目的是要取代 fgx 的 ActiveDialog, fgx原作真的很好用, 很棒! 但無奈換到 Radstudio 10.2 之後, fgx 的執行緒方法失效, 也就是在做另一件事時, 無法同步顯示一組 Waitting 的訊息, 為此我被迫放棄了 10.2 (雖然還有其他因素, 見稍早我的發文), 但這是最主要的原因, 因為如果不能有一個等待顯示器的話, 點選執行時, 在結果畫面出來前, 使用者永遠不知道裝置是不是當機了(舉凡開啟資料庫, 開啟form可能on create 要做很事, 下載資料, 上傳資料, 儲存資料等等...), 如果 fgx 在 10.2 也能順利運作, 或許我不會有這個開發念頭, 因為手上太多案子要做, 人生已半百, 還能有多少時間浪費在研究上?(雖然 fgx原作有釋出解法, 但我實作並不完美, 也不好用), 然而每每 xe 改版, 別人是說下一個會不會更好, 我都要提心吊膽下一版會不會我的程式, 那一些又不能用了, 從 XE2 到 XE10.2, 同一支程式我一共改了10次(XE2, 3, 3.5 ,4, 5, 6, 7, 8, 10, 10,1, 10.2)大改版, 並不是我自己程式改寫, 而是 XE 改版, 不是路徑改變, 就是物件換了家, 或被移除了, 這過程經歷了快6年了,
因此我一直想搞一支不會因為XE改版而提心吊膽的設計, 與其靠fgx, 靠別人, 一旦改版我就必須等待, 等待原作的改版, 如果遲遲未能釋放就只能等待再等待, 不如我自己做一支!

主題
這支程式, 我花了將近3個月的時間在女路上搜尋, 研究, 不敢說上萬篇, 超過5000篇po在我眼底溜過, 看過, 主體的顯示方式, 也是由網路上分享來的, 原po是只有轉圈, 我再加入特效, 就是第圈是紅點跑, 第二圈變成白點跑, 讓這個circle 看起來更順的接軌, 再來就是最近的執行緒的問題, 我也搜尋很多, 也求助過ktop先進, 試了十個種thread的寫法都不成功, 我要的結果就是很單純, 在跑主要的工作時, 能同步顯示提示效果, 正當我幾乎放棄的同時, 就在前天竟然讓我找到了本站的天使站長在2005年發表的thread範例, 在 10.2.3居然還能跑沒有任何錯誤(讓我太驚訝站長大人的功力), 而這支程式就是我要的, 花了兩天的時間研究如何套用在我這支程式, 今天終於做到我要的效果, 而且在 android 上運作無誤(win也ok, ios沒測), 所以在第一時間, 我分享出來給各位, 當然如果各位能再接手改良到完美, 也期待大家再分享出來, 畢竟我對therad 是完全不懂原理, 完全就是土法鍊鋼

感謝站長大人的程式
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=76536
可以重出江湖改一版?
感謝ktop上指點小弟的先進
感謝谷大神上所有分享thead的網友

程式
我是以 10.2.3 進行開發, 10.2版用戶應該使用都沒問題, 10.1用戶開啟程式, 可能會出現一些錯誤, 重新儲存一次也應該可以過關, 但10 以前的版本, 我就不敢保證了, 所以程式中有附一支exe給各位先看看!_
程式碼很少, 但可以做到我想要的, 這支是 FireMonkey的程式, 如果要用在 vcl 是也絕是沒問題的, 只要 form, frame 改成 vcl 模組就可以了

unit1 : mail form
F_ActiveDialog.pas: 這是一支Frame模組, 主要是顯示器畫面
U_Thead.pas, 這是沿用站長大人的程式, 主要為處理 Thread的功能, 但因為當時站長以 Object 包起來, 所以Thread必須傳入物件(以 Button為基底包程式)


所以點選 Button1 時不執行要跑的 for .. next 段, 而是包進 Thread(), 把要跑的for ... next 放到 _Button1Click 物件中, 我會命名 _Button1Click 是會方便識別關係(Button1Click)

Button1 中啟動 ActiveDialog 的 Start, 會傳入4組參數ActiveDialog1.Start(5, True, 'Threading', 'Thread Test');
第1組: 倒數次數
第2組: 要不要顯示倒數數字
第3組: 標題訊息
第4組: 提示訊息

最後在 for .. next 結束後, 下 ActiveDialog.Stop, 停止顯示器(即使倒數還沒有結束), 這個目的是展現主要工作做完, 就停止顯示

期待
想要改良的
1. 轉圈在 Android 上的弧表現有鋸齒狀, 如果能改成平滑就更好了
2. 站長用的Thread 能改成導入 procedure 或 function , 就不用這樣包來包去
3. 如果能加入音效又不會吃太大資源, 嗯... 讚
4. 我目前是做倒數, 我會再加入正數方式(這個我做的到, 沒問題)
5. 在跑的那個紅點, 如果能再有更好特效, 也不錯
6. 如果有更方便的Thread控制方式, 也歡迎改良

結言
xe 逐漸式微, 原因只有一個, 分享資源太少, 導致有心學習的後輩望之怯步, 大家手上都握有一些開發的技巧, 如果能分享釋出, 真的可以讓後輩們少很多痛苦的學習, 網路上很多釋出app, 但看得到吃不到, 這是很殘忍的事, 沒別的意思, 希望藉由這支程式, 大家多佛心來的, 阿彌陀佛, 功德無量!!


編輯記錄
P.D. 重新編輯於 2018-03-18 12:52:14, 註解 無‧
P.D. 重新編輯於 2018-03-18 12:56:58, 註解 無‧
P.D. 重新編輯於 2018-03-18 12:58:14, 註解 無‧
P.D. 重新編輯於 2018-03-18 13:11:58, 註解 無‧
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2018-03-19 15:29:25 IP:120.237.xxx.xxx 未訂閱
你的 rar 我 download 下来打开看了看。有几个问题。

1. 这个程式,是一个 Thread 在跑 Label1 的数字(这个我理解为你实际要做的任务),然后 TActiveDialog 里面那个圆圈(这个是一个 Dialog 吧?)是由 Timer 去跑的。这样是大问题。首先,耗时的代码,很可能是主 thread 在跑。而 Timer.OnTimer 也是主 Thread 在跑。因此,如果主 Thread 在执行一个很耗时的代码,比如,你用同步方式去打开一个网页(假如打开网页是采用 Indy 那套元件,是同步方式,也就是阻塞方式。)是依靠用户点了一个按钮,然后去打开网页,则是由主Thread去执行这个打开网页的操作,因为网络慢,主Thread被阻塞。在网页打开前,这个 TTimer 是不会有任何动作的。也就是说,这个 Dialog 是没有任何意义的。

2. 那个 TForm1._Button1Click 是被一个 Thread 来跑的。这里修改了 Label1.text。这里没看到做任何的线程同步。虽然我测试它没问题,能够执行,但这样很不安全,而且可能 OS 不同会带来不同的问题,严重时会让程序崩溃。
-------------

我现在知道你要的就是一个基于 Thread 的非阻塞的 Dialog,这个我很多年前就做过。回头我就在你的这个 Project 上改改,然后发一份改了之后的给你。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2018-03-19 15:34:56 IP:120.237.xxx.xxx 未訂閱
所以,这个 DEMO 应该是这样的:

1. 用一个 Timer 来跑 Label1,也就是用 Timer 跑主线程。

2. 用一个 Thread 来跑 Dialog 那个圈。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2018-03-19 16:09:17 IP:120.237.xxx.xxx 未訂閱
代码写好了。不知道怎么在这里发一个档案。点了 【按此上傳作品】就直接回到首页了。

留个 email 我发给你?
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2018-03-19 22:57:59 IP:118.169.xxx.xxx 未訂閱
太感謝了!
ktop上傳比較麻煩, 如果是首發文者, 可以直接選檔案上傳, 但如果是回文, 我試過好像上傳是無效的, 必須要到上傳區(或自開一個po文)上傳, 再把網址貼回到這裡即可,

另外是否願意分享出來呢? 如果願意, 我收到後可以代為釋出!
===================引 用 pcplayer99 文 章===================
代码写好了。不知道怎么在这里发一个档案。点了 【按此上傳作品】就直接回到首页了。

留个 email 我发给你?
編輯記錄
P.D. 重新編輯於 2018-03-20 15:34:21, 註解 無‧
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2018-03-20 10:12:21 IP:120.237.xxx.xxx 未訂閱
邮件发给你了。

分享出来没问题啊。本来就是在你的 Project 上增加了一些 Code 而已。
P.D.
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2018-03-20 15:33:47 IP:118.169.xxx.xxx 未訂閱
已收到, 感激, 再找時間研究一下後再釋出
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2018-03-21 10:49:53 IP:183.239.xxx.xxx 未訂閱
我的这个例子里面,用了两种方法。一种是用 TThread.Execute 的写法;一种是用 TTask.Run 的写法。

我以前写的 Blog,写过一篇解释 TTask.Run 的,可以对照着参考:

http://blog.csdn.net/pcplayer/article/details/69668434
test28
一般會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2018-05-08 04:26:01 IP:103.224.xxx.xxx 未訂閱
請問資料存取完畢後,要如何將ActiveDialog畫面消失,謝謝
系統時間:2024-04-29 9:32:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!