查看積分策略說明發表回覆
Discuz! 代碼
提示插入
直接插入
說明訊息

插入粗體文本 插入斜體文本 插入下劃線 置中對齊 插入超級連結 插入信件位址 插入圖像 插入 flash 插入代碼 插入引言 插入列表
刪除線 直線分隔線 虛線分隔線
    
添加文字底框
內容 [字數檢查]:

表情符號

更多 Smilies
字型大小 |||
溫馨提示:本區開放遊客瀏覽。


文章關鍵字 : [功能說明]
(關鍵字可加強搜索準確性, 如關鍵字多於一組, 請以 , 作分隔, e.g. : 阿笨,shiuh,第一笨)

 關閉 URL 識別 | html 禁用
 關閉 表情符號 | 表情符號 可用
 關閉 Discuz! 代碼 | Discuz! 代碼 可用
使用個人簽名
接收新回覆信件通知
推薦放檔網絡空間

檔案(Torent, zip等)
  1. freedl
  2. multiupload
  3. btghost
  4. 便當狗
  5. mediafire
  6. pillowangel
圖片(JPG, GIF等)
  1. hotimg
  2. tinypic
  3. mousems2
  4. imageshack
  5. imm.io
>>>歡迎推薦好用空間


最新10篇文章回顧
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 吧

你這樣說 好像是在說 白馬非馬


本主題回覆較多,請 點擊這裡 檢閱。



所在時區為 GMT+8, 現在時間是 2024-4-28 07:45 AM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.021065 second(s), 7 queries , Qzip disabled