ROACH
|
發表於 2012-5-19 11:39 AM |
這2008年的文章怎被撈起來的@@
話說.公司一直在變化..
之前本來以為要導入MOSS派我去上C#快兩個禮拜
那還真不容易C#要學、還要學ASP .NET 還要學XML、XSLT
結果後來公司又不上的....囧rz
算的多學也好....
後來公司改上SAP NetWeaver 所以現在又開始走java的
NetWeaver 的網站完全用不上html語法@@..連JavaScript都不能用...完全在SAP自己訂出來的框架裡面玩...囧rz
至於C#太久沒用也快忘了..
| |
homiwu
|
發表於 2012-4-7 01:14 PM |
|
Litfal
|
發表於 2011-8-13 09:15 PM |
這什麼時候的文章居然被挖上來XD
既然看到就來留個心得:
在開始說Timer之前,先提一點:
.NET限制能存取視窗控制項屬性的,只有建立該控制項的執行緒。
另外,我說明舉例的角色A、B、C都是以執行緒觀點來看,你也可以將其視為"工人"。
.Net提供的Timer有三個:
System.Windows.Forms下面有一個,Threading和Timers裡面各有一個。
除了這三個以外,用ThreadPool.RegisterWaitForSingleObject也可以自己實作Timer的東西。
System.Windows.Forms是靠註冊計時器,並使用Send Message的方式向Window Form觸發計時器耗盡事件。(計時器耗盡->發送訊息給Timer的所在Form->Form處理訊息->Form呼叫耗盡事件函式)
由於收到訊息的是所在Form的handle,所以一定能保證呼叫事件的,與該form的執行緒是同一個,可以隨意操作視窗控制項,而不會發生跨執行緒作業失敗。
感覺就像這樣:(A請B時間到叫他->B開始計時->B時間到叫A->A收到通知後去做某件事)。
由於B被封裝隱藏的很好,使用者會感覺A是自己計時自己做事的。
缺點:
1.訊息是以Message Pump的方式序列在一個緩衝區,Form的執行緒會一個接一個處理這些訊息;當你的視窗很忙的時候,你就不能確保計時器訊息會在第一時間被處理。
2.當你的計時器訊息觸發的是一個耗時工作時,耗盡事件時UI會停止回應直到工作完成;當然你可以另外建一個執行緒來處理耗時的部分,最後才將需要通知UI顯示的部分Invoke給UI執行緒,但你不覺得這樣拐彎抹角嗎?看看下面兩個工作案例:(A叫B時間到叫他->B開始計時->B時間到叫A->A收到通知叫C去做件事、做好叫他->C做好叫A)、(A叫B時間到做件事、做好叫他->B開始計時->B時間到做事->B做好叫A),哪個比較複雜應該一目瞭然?這種情況就應該使用Threading.Timer。另外,建立執行緒也是件cost很高的作業。
Threading.Timer,則是結合計時與工作於一身。建立時就要告訴它時間到要做什麼工作,而不是事件委派;也就是說,建立後就不能改變工作了。建立時會從ThreadPool去要執行緒,也就是說,他和建立他的絕不會是同一個執行緒。
感覺就像這樣:(A到一群手下裡面隨便叫一個B、時間到去做某件事->B開始計時->B時間到->需要的話叫人做下一次的工作*有可能是自己->B開始工作)
所以使用上要注意到,有些狀況要使用Invoke通知建立執行緒。
Timers.Timer則專職計時,時間到了就把工作用事件委派下去,接下來他完全不管。
感覺就像這樣:(A請B計時並派定工作->B時間到了將手上的工作(事件)分別叫個工人來做->B繼續他的計時作業)
所以用時和Threading一樣要注意跨執行續作業。
Threading和Timers提供的Timer用起來其實蠻像的,差別在於
1. Threading.Timer 更輕量。
2. Timers.Timer 通常較準確一些、Threading.Timer 可能被一些奇怪的鎖定狀況影響進度。
3. Timers.Timer 可以利用事件做多重委派、或是改變工作。
一般我是這樣決定使用時機:
1. 耗時、須多重委派 -> Timers.Timer
2. 多執行緒關係複雜,且須精確觸發 -> Timers.Timer
3. 與Form有關、非耗時工作 -> Form.Timer
4. 其餘 Threading.Timer
累了,關於Invoke和BeginInvoke,下次再說吧。
[Litfal 在 2011-8-13 09:20 PM 作了最後編輯]
| |
Dr.J
|
發表於 2011-8-6 07:20 AM |
基本上就是你可以加好幾個timer,分別設定不同的時間
然後指定這些timer要做什麼事情
這些timer時間到了就做這些事情,各個timer都是分開的
所以就想成只是計時用的就ok了
| |
ericshliao
|
發表於 2011-8-5 03:03 PM |
引用: ROACH寫到:
有件事情我觀念一直弄不清楚
設定一個timer在跑的時候,可以同步在執行別的動作?那它是另一個執行序在執行嗎?
需要用thread來搭配timer嗎?
搞不董當timer設定每秒鐘做一件事情的話!那其它工作怎辦
一般來說(和C#無關),timer CLASS不是自己「在跑」,而是「被跑」,被一個main process「跑」。如果是用「timer在跑」這個角度去思考,可能會以為timer本身就是一個process或thread(否則沒辦法自己跑)。但如果用timer是「被跑」的這個角度去理解,當設定了timer的inrterval後,main process會一一去檢查每個timer設定的interval到了沒,如果到了,就執行預定的動作。也就是說,timer一定是依附於某個process或thread,但timer本身不必是一個process或thread。
我沒學過C#,但我猜想,這個觀念應該也可以用在C#上。
| |
lin66816
|
發表於 2011-8-4 06:06 PM |
最近剛好也在寫C#
剛好也有用到Invoke,根據我的經驗...
你可以把Invoke視為由背景OS去幫你執行某一個事件
而這個事件必須是有 委派 的function
委派的function可以看做是C++的function pointer
例如:
一般來說在thread裡面沒辦法去修改form的控制項的所有參數
但你可以透過委派跟Invoke來修改
舉一個簡單的例子...
我在某一個thread裡面想去修改ListBox的內容
就必須先把InvokeListBoxAdd委派給MethodListBoxAdd
public delegate void MethodListBoxAdd(ListBox Name, bool Flag, string Message);
public void InvokeListBoxAdd(ListBox Name, bool Flag, string Message)
{
if (Name.InvokeRequired)
{
MethodListBoxAdd t = new MethodListBoxAdd(InvokeListBoxAdd);
Name.Invoke(t, Name, Flag, Message);
}
else
{
if (Flag)
{
Name.Items.Add(Message);
Name.SetSelected(Name.Items.Count - 1, true);
}
else
Name.Items.Clear();
}
}
上述範例如果我是在Form的主執行序呼叫InvokeListBoxAdd,不會進去if (Name.InvokeRequired)裡面,如果是在執行序呼叫InvokeListBoxAdd的話就會進去,然後委派MethodListBoxAdd執行Invoke就可以達成我在執行序修改ListBox內容的動作。
以上如有錯誤可以提出大家討論,thanks。
| |
天~~
|
發表於 2009-1-24 02:23 AM |
小弟不材解說~^^有錯誤請更正
forms.Timer 是在視窗的執行緒上跑的 他會加入表單的執行排隊中(假設只有一個表單 )
每次輪到他,他就會檢查時間是否到了!!!
Threading 是產生一個執行緒 簡單的說就是 一個是你的表單(假設只有一個) 一個就是你 宣告產生的
廣義的說就是原本1個人做事情 現在變成2個人做事情
不過系統上來說就算執行緒很多個也是用輪的(看演算法)
委派 就像你有一位秘書,你把要 誰要做什麼事情 跟他說,他就會去幫你找那個人幫忙處理了
[天~~ 在 2009-1-24 02:27 AM 作了最後編輯]
| |
Pika123
|
發表於 2009-1-23 10:57 PM |
可以純粹只推X神童的回覆嘛XD?
印象中這裡應該不會拒絕不到三行文的文章吧~
雖然還是三行了...
我覺得Timer應該也是會去檢查時間間隔到了沒
但是比起另外開一條線來的節省CPU的工作吧!?
因為可能是某個CPU以外的component在檢查
當時間到了就送一個interrupt之類的
以上完全是猜想...講錯請鞭小力點orz
| |
桂正和
|
發表於 2008-12-11 05:05 AM |
http://blog.darkthread.net/blogs ... ead-limitation.aspx
這篇文章或許有些幫助
對於thread跟timer我的理解還沒有很專精
不過thread這種東西就是一個執行緒
比較快理解的方式是
像是我們可以同時開啟許多IE
這些IE又分別去開啟了一些網頁
實際上執行的是同一個程式
但是用的執行緒卻是不同
比較像是一種複製的行為
讓程式可以同時執行兩個以上
以便各做各的事情
當然
在程式中必須為程式一些會重覆衝到的地方加上thread
並且在會衝到的地方設定Invoke去執行我們新開出來的執行緒
而不是直接去動到程式本身
在一開始的範例裡面
對照著兩者間的程式碼我想應該就可以看得懂了
利用Invoke去啟動/變更在程式中一開始建立的執行緒中的控制項功能
至於timer就跟毒王說的一樣
是一種定時化裝置
讓程式可以隔一段時間後重新執行我們所需要執行的步驟
例如讓瀏覽器定時刷新網頁
[桂正和 在 2008-12-11 05:07 AM 作了最後編輯]
| |
psycho
|
發表於 2008-12-9 05:37 AM |
引用: Acute寫到:
沒用過C#
不過, 除了Invoke 這個詞彙外, 其餘都是標準programming 觀念的詞彙
Thread & Timer 用途是怎樣, 用一個最簡單的例子來解釋
假設現在沒有一個"顯示時間"的元件, 而你要去做這個元件
當你用Thread 去做, 程式就很笨的一直檢查目前時間, 直到時間改變了, 然後重新顯示時間
這過程當中, 你的程式一直在消耗CPU 效能, 因為你一直取得系統時間, 檢查系統時間是否改變
[/url]
Acute.
timer 本身就是一個thread 吧
冏
你這樣說 好像是在說 白馬非馬
| |
本主題回覆較多,請 點擊這裡 檢閱。 |