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

Thread中callback和UI的更新

答題得分者是:aftcast
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-05-22 10:47:40 IP:122.146.xxx.xxx 訂閱
各位先進好,



我參考了底下的連結,它是比較三種計時器的範例:

http://tc.chinawin.net/it/softwaredev/article-66a7.html



其中一種,利用 timeSetEvent,帶入callback,範例中的callback是這樣寫的:

[code delphi]
procedure TimeProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall;
begin
Form1.Edit2.Text:=FloatToStr(smmCount);
smmCount:=smmCount-0.01;
end;
[/code]



我實測發現處理UI的地方會有問題,

以前在Thread中要更改UI是用Synchronize,如果是Thread callback回來的,要如何處理UI呢?

不吝指教,謝謝。
編輯記錄
ttnnrsseb 重新編輯於 2015-05-22 10:48:43, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-05-22 13:21:28 IP:114.32.xxx.xxx 訂閱
試一下下面的方式:
procedure TimeProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall;
begin
TThread.Queue(nil, procedure 
begin
  Form1.Edit2.Text:=FloatToStr(smmCount);
  smmCount:=smmCount-0.01;
end
);
end; 
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-05-22 13:56:48 IP:122.146.xxx.xxx 訂閱
感謝蕭大俠的回覆,

試了一下,多跑幾次還是會出現問題,不過機率不高。
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-05-22 14:04:13 IP:117.19.xxx.xxx 訂閱
把我上面程式中queue改Synchronize這個字再試一下。再錯就很不合理了。^_^
===================引 用 ttnnrsseb 文 章===================
感謝蕭大俠的回覆,

試了一下,多跑幾次還是會出現問題,不過機率不高。
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-05-22 14:04:38 IP:122.146.xxx.xxx 訂閱
網上有看到多包了一層,目前試起來還沒問題。還真沒寫過這種奇怪的寫法。

[code delphi]
procedure TimeProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall;
var
aTask: ITask;
begin
aTask := TTask.Create(procedure
begin
TThread.Queue(nil, procedure
begin
//不要直接處理UI
Form1.Edit2.Text := FloatToStr(smmCount);
smmCount := smmCount - 0.01;
end);
end);
aTask.Start;
end;
[/code]

編輯記錄
ttnnrsseb 重新編輯於 2015-05-22 14:05:20, 註解 無‧
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-05-22 14:10:14 IP:122.146.xxx.xxx 訂閱
蕭大俠您回覆的真快,但還是掛了,包含我剛才試的ITask。
我的環境是Win7 64bit XE7 FireMonkey



===================引 用 aftcast 文 章===================
把我上面程式中queue改Synchronize這個字再試一下。再錯就很不合理了。^_^

===================引 用 ttnnrsseb 文 章===================

感謝蕭大俠的回覆,



試了一下,多跑幾次還是會出現問題,不過機率不高。
編輯記錄
ttnnrsseb 重新編輯於 2015-05-22 14:12:04, 註解 無‧
ttnnrsseb
中階會員


發表:30
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-05-22 14:23:41 IP:122.146.xxx.xxx 訂閱
Dear 蕭大俠,

目前用上面的ITask Synchronize,還沒遇過錯誤,不過我還不知道為什麼要這樣寫。

大概了解Queue是非阻塞式的,Synchronize是阻塞式的,所以理論上Synchronize應該不會有問題。

會不會是FireMonkey比較奇怪,查了一下資料
System.Threading‧ITask是XE7才新增的,用來做並行處理的。

對岸有個簡單的範例:

http://blog.csdn.net/henreash/article/details/41347843
編輯記錄
ttnnrsseb 重新編輯於 2015-05-22 14:39:13, 註解 無‧
系統時間:2017-12-12 0:56:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!