RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [C&C++] [問題]問問timer與執行序的觀念C#   字型大小:||| 
ROACH
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30
減肥中!請勿餵食

十週年紀念徽章(四級)  

 . 積分: 15119
 . 精華: 14
 . 文章: 11767
 . 收花: 140853 支
 . 送花: 6005 支
 . 比例: 0.04
 . 在線: 8870 小時
 . 瀏覽: 85616 頁
 . 註冊: 8211
 . 失蹤: 6
 . 鄉下地方
#1 : 2008-8-1 12:55 AM     只看本作者 引言回覆

最近公司為的要導入Sharepoint派我去恆毅資訊參加C#的訓練
看看恆毅資訊的一角!總之就是一下課灌可樂上課灌咖啡就對的~還不錯




有件事情我觀念一直弄不清楚
設定一個timer在跑的時候,可以同步在執行別的動作?那它是另一個執行序在執行嗎?
需要用thread來搭配timer嗎?
搞不董當timer設定每秒鐘做一件事情的話!那其它工作怎辦

還有一個Invoke這個跟BeginInvoke有什麼不同跟thread有什麼不同
是不是如果牽扯到需要同步變更 Windows Form 控制項元件的屬性的話就要用Invoke跟委派?
其它的就用thread就好

上次看一篇文章說 寫入文字檔可以用StreamWriter來做
那假如我要刪除某個文字檔的某一行?那我要怎做呢?


哈!剛學C#就被委派執行序搞混的......
以前寫JAVA很少用到執行序也沒想到那麼多

只是最近想用C#自己寫一個msn機器人起來,開始研究到如何同步處理
每個USER的訊息回覆跟判斷,遇到好多問題喔~~

等到穩定下來,我再分享給大家~大家就可以自己架一個msn bot來玩玩的

[ROACH 在  2008-8-1 08:46 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Ailio
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30
鸚鵡螺號 艦長

十週年紀念徽章(五級)  

今日心情

 . 積分: 2664
 . 文章: 6462
 . 收花: 22900 支
 . 送花: 4903 支
 . 比例: 0.21
 . 在線: 2826 小時
 . 瀏覽: 85748 頁
 . 註冊: 7450
 . 失蹤: 116
 . 莫名奇妙的商人星球
#2 : 2008-8-1 06:04 PM     只看本作者 引言回覆

話說我入門入了很久....(現在大概屬於在門上的地步...XD)
也不太熟執行緒.....

之前用其他語言玩Timer的感覺
Timer好像都是自己一個執行緒
也就是他跑他的 你程式依然在Run 其他的程序

不過因為Timer一般都設比較長(分鐘計)
如果時間更短 同時間執行一堆東西會不會打架就不知道了....

打了一堆字
其實....
我不是來解答的 我也是希望能有高手能幫我上一課

希望能有人解釋 +1



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
dayi
開墾隊隊員
等級: 14等級: 14等級: 14等級: 14
ZeroX

十週年紀念徽章(五級)  

今日心情

 . 積分: 935
 . 文章: 2060
 . 收花: 7802 支
 . 送花: 2401 支
 . 比例: 0.31
 . 在線: 2821 小時
 . 瀏覽: 61582 頁
 . 註冊: 7130
 . 失蹤: 1228
 . ZeroX
#3 : 2008-8-1 09:24 PM     只看本作者 引言回覆

小弟對C#也是入門而已
如果有錯請指正

Timer就其行為來說
把它想做是一個定時器(其實也只是個定時器)
時間到了就執行被指派的行為
比如說Outlook定時每10分鐘check有沒有新的郵件

Thread則是可用在不互相干擾的行為上(如果沒寫好還是可能會互相干擾)
比如說我有一份報表的資料要從3個資料庫中取得
而且是不會互相影響的
那麼我一個主程式進去之後
我就可以開3個thread各自去不同資料庫要資料
這時就可以看出Single thread和Multi thread的差別
3組資料各自需要10,20,30秒的時間
在ST的情形下,我的資料必需一個做完才做下一個,需時 10+20+30=60秒
在MT的情形下,3個同時去要資料,我只要30秒
耗費的時間上馬上節省了一半

和Timer和Thread沒有絕對的關係
Timer裡可以用Thread
Thread也可以用Timer

至於Inovke
我一時還想不到什麼比較好的解釋(其實是我中文太差 XD)
還請其他高手來說明



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
digisp
鐵驢友〔初級〕
等級: 4


 . 積分: 35
 . 文章: 115
 . 收花: 277 支
 . 送花: 186 支
 . 比例: 0.67
 . 在線: 96 小時
 . 瀏覽: 870 頁
 . 註冊: 7100
 . 失蹤: 931
#4 : 2008-8-13 10:32 PM     只看本作者 引言回覆

Timer Class 所在的命名空間是
System.Threading
[ComVisibleAttribute(true)]
public sealed class Timer : MarshalByRefObject, IDisposable

^^
這篇文章大家有空可以參考一下
http://msdn.microsoft.com/en-us/library/ms998490.aspx

關於其他Invoke
在藍色小舖這邊,有高手已經回答過了
http://www.blueshop.com.tw/board ... 253INM&rplcnt=3

可以參考看看^^



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 8216
 . 失蹤: 5568
#5 : 2008-12-7 01:49 PM     只看本作者 引言回覆

沒用過C#
不過, 除了Invoke 這個詞彙外, 其餘都是標準programming 觀念的詞彙
Thread & Timer 用途是怎樣, 用一個最簡單的例子來解釋
假設現在沒有一個"顯示時間"的元件, 而你要去做這個元件

當你用Thread 去做, 程式就很笨的一直檢查目前時間, 直到時間改變了, 然後重新顯示時間
這過程當中, 你的程式一直在消耗CPU 效能, 因為你一直取得系統時間, 檢查系統時間是否改變

當你用Timer 去做, 他是定時來執行你指定的函式, 所以, 直到你指定的時間間隔到了
CPU 才需要花力氣去執行你的程式碼

換句話說, Thread 是一段不斷運行的程式碼, 而Timer 則是一個固定時間間隔才被執行的程式碼 !!

至於Invoke, 從詞彙上直接反應就是... 呼叫
呵, 不鬧了, 我去MSDN 上查詢了一下... 其實.. 真的就是.....呼叫, 只是被加工過
http://msdn.microsoft.com/zh-tw/library/zyzhdc6b(VS.80).aspx

上面是MSDN 對於Invoke 的解釋

Acute.



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
psycho
鐵驢友〔初級〕
等級: 4


 . 積分: 42
 . 文章: 137
 . 收花: 353 支
 . 送花: 29 支
 . 比例: 0.08
 . 在線: 263 小時
 . 瀏覽: 1660 頁
 . 註冊: 6140
 . 失蹤: 4338
#6 : 2008-12-9 05:37 AM     只看本作者 引言回覆


引用:
Acute寫到:
沒用過C#
不過, 除了Invoke 這個詞彙外, 其餘都是標準programming 觀念的詞彙
Thread & Timer 用途是怎樣, 用一個最簡單的例子來解釋
假設現在沒有一個"顯示時間"的元件, 而你要去做這個元件

當你用Thread 去做, 程式就很笨的一直檢查目前時間, 直到時間改變了, 然後重新顯示時間
這過程當中, 你的程式一直在消耗CPU 效能, 因為你一直取得系統時間, 檢查系統時間是否改變
[/url]



Acute.

timer 本身就是一個thread 吧

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



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
桂正和
銀驢友〔初級〕
等級: 12等級: 12等級: 12
論壇第一窮

今日心情

 . 積分: 448
 . 文章: 777
 . 收花: 3245 支
 . 送花: 1392 支
 . 比例: 0.43
 . 在線: 1624 小時
 . 瀏覽: 33426 頁
 . 註冊: 8020
 . 失蹤: 1462
 . 台灣
#7 : 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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Pika123
論壇第二呆
等級: 10等級: 10等級: 10


今日心情

 . 積分: 178
 . 文章: 1565
 . 收花: 775 支
 . 送花: 883 支
 . 比例: 1.14
 . 在線: 1281 小時
 . 瀏覽: 22934 頁
 . 註冊: 8213
 . 失蹤: 1406
 . 台中
#8 : 2009-1-23 10:57 PM     只看本作者 引言回覆

可以純粹只推X神童的回覆嘛XD?
印象中這裡應該不會拒絕不到三行文的文章吧~
雖然還是三行了...

我覺得Timer應該也是會去檢查時間間隔到了沒
但是比起另外開一條線來的節省CPU的工作吧!?
因為可能是某個CPU以外的component在檢查
當時間到了就送一個interrupt之類的

以上完全是猜想...講錯請鞭小力點orz



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
天~~
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


 . 積分: 244
 . 文章: 325
 . 收花: 2217 支
 . 送花: 778 支
 . 比例: 0.35
 . 在線: 990 小時
 . 瀏覽: 9542 頁
 . 註冊: 6476
 . 失蹤: 3262
#9 : 2009-1-24 02:23 AM     只看本作者 引言回覆

小弟不材解說~^^有錯誤請更正

forms.Timer  是在視窗的執行緒上跑的  他會加入表單的執行排隊中(假設只有一個表單 )

每次輪到他,他就會檢查時間是否到了!!!

Threading 是產生一個執行緒  簡單的說就是 一個是你的表單(假設只有一個) 一個就是你 宣告產生的

廣義的說就是原本1個人做事情 現在變成2個人做事情

不過系統上來說就算執行緒很多個也是用輪的(看演算法)


委派 就像你有一位秘書,你把要  誰要做什麼事情     跟他說,他就會去幫你找那個人幫忙處理了

[天~~ 在  2009-1-24 02:27 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
lin66816
銀驢友〔初級〕
等級: 12等級: 12等級: 12


 . 積分: 453
 . 文章: 219
 . 收花: 3596 支
 . 送花: 321 支
 . 比例: 0.09
 . 在線: 3657 小時
 . 瀏覽: 14090 頁
 . 註冊: 6981
 . 失蹤: 1206
#10 : 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。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
ericshliao
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


今日心情

 . 積分: 849
 . 精華: 2
 . 文章: 1589
 . 收花: 7188 支
 . 送花: 5723 支
 . 比例: 0.8
 . 在線: 5412 小時
 . 瀏覽: 20831 頁
 . 註冊: 6981
 . 失蹤: 3483
#11 : 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#上。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Dr.J
銅驢友〔初級〕
等級: 8等級: 8


今日心情

 . 積分: 129
 . 文章: 813
 . 收花: 908 支
 . 送花: 294 支
 . 比例: 0.32
 . 在線: 2040 小時
 . 瀏覽: 1070 頁
 . 註冊: 8207
 . 失蹤: 2707
#12 : 2011-8-6 07:20 AM     只看本作者 引言回覆

基本上就是你可以加好幾個timer,分別設定不同的時間
然後指定這些timer要做什麼事情
這些timer時間到了就做這些事情,各個timer都是分開的
所以就想成只是計時用的就ok了



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Litfal
銀驢友〔初級〕
等級: 12等級: 12等級: 12
寫奇怪的程式中

十週年紀念徽章(六級)  

 . 積分: 486
 . 文章: 322
 . 收花: 4068 支
 . 送花: 3976 支
 . 比例: 0.98
 . 在線: 965 小時
 . 瀏覽: 7522 頁
 . 註冊: 6476
 . 失蹤: 3457
#13 : 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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
homiwu
驢有所悟
等級: 3等級: 3


今日心情

 . 積分: 15
 . 文章: 24
 . 收花: 27 支
 . 送花: 8 支
 . 比例: 0.3
 . 在線: 506 小時
 . 瀏覽: 11621 頁
 . 註冊: 7422
 . 失蹤: 21
#14 : 2012-4-7 01:14 PM     只看本作者 引言回覆

抱歉= = 還是看不懂= =....


[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
ROACH
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30
減肥中!請勿餵食

十週年紀念徽章(四級)  

 . 積分: 15119
 . 精華: 14
 . 文章: 11767
 . 收花: 140853 支
 . 送花: 6005 支
 . 比例: 0.04
 . 在線: 8870 小時
 . 瀏覽: 85616 頁
 . 註冊: 8211
 . 失蹤: 6
 . 鄉下地方
#15 : 2012-5-19 11:39 AM     只看本作者 引言回覆

這2008年的文章怎被撈起來的@@
話說.公司一直在變化..
之前本來以為要導入MOSS派我去上C#快兩個禮拜
那還真不容易C#要學、還要學ASP .NET 還要學XML、XSLT
結果後來公司又不上的....囧rz
算的多學也好....

後來公司改上SAP NetWeaver  所以現在又開始走java的
NetWeaver 的網站完全用不上html語法@@..連JavaScript都不能用...完全在SAP自己訂出來的框架裡面玩...囧rz
至於C#太久沒用也快忘了..



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-11-22 12:11 PM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.872706 second(s), 6 queries , Qzip disabled