新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
不需要控件就可以,用多线程的方式实现,在窗体上放一个Label和一个button按钮,代码如下:
创新互联建站专注于企业全网整合营销推广、网站重做改版、海林网站定制设计、自适应品牌网站建设、成都h5网站建设、商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为海林等各大城市提供网站开发制作服务。
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 = "结束"
Start = DateAndTime.Timer
td = New Thread(AddressOf fun1)
td.Start()
Else
Button1.Text = "开始"
td.Abort()
End If
End Sub
'定义一个线程
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
'定义一个委托
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中的代码执行一次,执行时间将大于100毫秒,这是产生误差的地方之一。invoke执行一个方法txt,必须等txt里面的代码运行完毕,方法才能返回,期间占用的时间全是“误差”。
无限循环,且没有退出机制,停不下来。
GetTickCount()返回的是系统从启动到现在的时间,单位是毫秒,你上述过程计算机用不了1毫秒就完成过程了,所以返回时间是0,你把循环次数调的多一点就能看到时间了,反正我的系统做这150次循环的时间是16毫秒吧,你可以试试看
试过NN次后,我“也”发现这种记录时间的精度为10.0144毫秒,
看来,这个问题是由CLR决定的,如果,只使用FCL的函数,看来没办法解决这一问题了!
看了 LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) ,给出的文章链接,
受了些启发,对于文章中实现的那个A类,我没看太明白,但是,文章中用到了QueryPerformanceCounterp这个win API函数,楼主,可以导入用一下,我试过多次,在我的机子上,其精度为 210/1000 毫秒左右。
QueryPerformanceCounter这个函数的是一个计数器函数,以百万分之一秒为单位,来记算时间数。
//=============
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是经过四舍五入,得到的0.1毫秒的精度
这种功能用不到TIMER,TIMER控件用在这种地方也不适合。(假如你所统计的时间很短,在几分中内话,可以使用,假如你统计的时间很长:几小时、几天几夜,建议改用以下方式):
在你需要开始计时的地方加入一个记录当前时间,在你想结束的地方也得到一个当前时间。然后将两个时间相减。
希望以上思路可以帮到你。
不对。步骤如下:
添加一个label标签名字label1 用来显示时间
再添加一个timer控件 名字timer1 interval属性=1000 用来计时
窗体添加代码
Dim t As Date '用来记录时间
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
t = t.AddSeconds(1)
Label1.Text = "登录时间:" t.TimeOfDay.ToString
End Sub