一支執行緒的Dialog |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
自序
這是我一直想要做的 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, 但看得到吃不到, 這是很殘忍的事, 沒別的意思, 希望藉由這支程式, 大家多佛心來的, 阿彌陀佛, 功德無量!! |
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
你的 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 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
太感謝了!
ktop上傳比較麻煩, 如果是首發文者, 可以直接選檔案上傳, 但如果是回文, 我試過好像上傳是無效的, 必須要到上傳區(或自開一個po文)上傳, 再把網址貼回到這裡即可, 另外是否願意分享出來呢? 如果願意, 我收到後可以代為釋出! ===================引 用 pcplayer99 文 章=================== 代码写好了。不知道怎么在这里发一个档案。点了 【按此上傳作品】就直接回到首页了。 留个 email 我发给你?
編輯記錄
P.D. 重新編輯於 2018-03-20 15:34:21, 註解 無‧
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
test28
一般會員 發表:28 回覆:28 積分:16 註冊:2013-08-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |