不需要控件就可以,用多線程的方式實(shí)現(xiàn),在窗體上放一個(gè)Label和一個(gè)button按鈕,代碼如下:
創(chuàng)新互聯(lián)建站專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、海林網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為海林等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
Imports?System.Threading
Public?Class?Form1
Dim?Start?As?Double
Dim?td?As?Thread
Private?Sub?Form1_Load(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?MyBase.Load
Label1.Text?=?"00:00:00?000"
Button1.Text?=?"開始"
End?Sub
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
If?Button1.Text?=?"開始"?Then
Button1.Text?=?"結(jié)束"
Start?=?DateAndTime.Timer
td?=?New?Thread(AddressOf?fun1)
td.Start()
Else
Button1.Text?=?"開始"
td.Abort()
End?If
End?Sub
'定義一個(gè)線程
Private?Sub?fun1()
Dim?elapsed?As?TimeSpan
Dim?Dg_txt?As?New?Dg(AddressOf?txt)
Do
elapsed?=?TimeSpan.FromMilliseconds((DateAndTime.Timer?-?Start)?*?1000)
Me.Invoke(Dg_txt,?elapsed.ToString,?Label1)
Thread.Sleep(100)
Loop
End?Sub
'定義一個(gè)委托
Delegate?Sub?Dg(ByVal?s?As?String,?ByVal?obj?As?Label)
Sub?txt(ByVal?s?As?String,?ByVal?obj?As?Label)
obj.Text?=?s
End?Sub
End?Class
elapsed.Milliseconds 獲取毫秒。
每100毫秒,do中的代碼執(zhí)行一次,執(zhí)行時(shí)間將大于100毫秒,這是產(chǎn)生誤差的地方之一。invoke執(zhí)行一個(gè)方法txt,必須等txt里面的代碼運(yùn)行完畢,方法才能返回,期間占用的時(shí)間全是“誤差”。
無限循環(huán),且沒有退出機(jī)制,停不下來。
GetTickCount()返回的是系統(tǒng)從啟動(dòng)到現(xiàn)在的時(shí)間,單位是毫秒,你上述過程計(jì)算機(jī)用不了1毫秒就完成過程了,所以返回時(shí)間是0,你把循環(huán)次數(shù)調(diào)的多一點(diǎn)就能看到時(shí)間了,反正我的系統(tǒng)做這150次循環(huán)的時(shí)間是16毫秒吧,你可以試試看
試過NN次后,我“也”發(fā)現(xiàn)這種記錄時(shí)間的精度為10.0144毫秒,
看來,這個(gè)問題是由CLR決定的,如果,只使用FCL的函數(shù),看來沒辦法解決這一問題了!
看了 LoveCherry(論成敗,人生豪邁;大不了,重頭再來!^_^) ,給出的文章鏈接,
受了些啟發(fā),對(duì)于文章中實(shí)現(xiàn)的那個(gè)A類,我沒看太明白,但是,文章中用到了QueryPerformanceCounterp這個(gè)win API函數(shù),樓主,可以導(dǎo)入用一下,我試過多次,在我的機(jī)子上,其精度為 210/1000 毫秒左右。
QueryPerformanceCounter這個(gè)函數(shù)的是一個(gè)計(jì)數(shù)器函數(shù),以百萬分之一秒為單位,來記算時(shí)間數(shù)。
//=============
using System.Runtime.InteropServices;
using System.Threading;
[DllImport("kernel32.dll")]
static extern bool QueryPerformanceCounter([In, Out] ref long lpPerformanceCount);
long t1 = 0;
long t2 = 0;
QueryPerformanceCounter(ref t1);
Thread.Sleep(1); //掛起一毫秒,作為演示
QueryPerformanceCounter(ref t2);
long sp = t2 - t1;//sp的單位為百萬分之一秒
float f_time = (float)((decimal) sec / (decimal)10000); //得到0.0001毫秒的精度
f_time = float.Parse(string.Format("{0:F1}",f_time)); //f_time是經(jīng)過四舍五入,得到的0.1毫秒的精度
這種功能用不到TIMER,TIMER控件用在這種地方也不適合。(假如你所統(tǒng)計(jì)的時(shí)間很短,在幾分中內(nèi)話,可以使用,假如你統(tǒng)計(jì)的時(shí)間很長:幾小時(shí)、幾天幾夜,建議改用以下方式):
在你需要開始計(jì)時(shí)的地方加入一個(gè)記錄當(dāng)前時(shí)間,在你想結(jié)束的地方也得到一個(gè)當(dāng)前時(shí)間。然后將兩個(gè)時(shí)間相減。
希望以上思路可以幫到你。
不對(duì)。步驟如下:
添加一個(gè)label標(biāo)簽名字label1 用來顯示時(shí)間
再添加一個(gè)timer控件 名字timer1 interval屬性=1000 用來計(jì)時(shí)
窗體添加代碼
Dim t As Date '用來記錄時(shí)間
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
t = t.AddSeconds(1)
Label1.Text = "登錄時(shí)間:" t.TimeOfDay.ToString
End Sub