vb中怎么用timer控件设置一个等待时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb中怎么用timer控件设置一个等待时间相关的知识,希望对你有一定的参考价值。

1、程序很简单,每输出一个数后等2分钟然后再输出下一个数。下面我用timer控件编的程序好像interval属性就没有起作用了。为什么?我想等待时间直接设置interval属性来实现,不要程序。怎么才能做到呢?
2、for循环语句中,当循环的次数较多时,此时不能对vb程序进行任何操作,否则程序变为未响应状态,窗体中的数据不再变化,但存储文件中在继续存数据,即程序仍然在运行。不知道为什么。
希望有大侠帮忙!!

Private Sub Command1_Click()
Dim k As Long
For k = 0 To 2000
Picture1.Print k
call timer1.timer
Next i
End Sub

Private Sub Timer1_Timer()
Dim T1 As Double
Dim T2 As Double
T1 = Timer
7020 T2 = Timer - T1
7030 If T2 > 1 Then GoTo 7060
7035 GoTo 7020
7060 End Sub
谢谢楼上的热心的解答,第一个问题已经解决。第二个问题我觉得不是print的问题。
当把print去掉后,只留下call timer1.timer,这个for语句也会出现程序未响应的情况。

vb中的循环语句是不是有这种类似的缺陷?

以下程序利用Timer,使得程序等待1秒(1000毫秒)后继续执行

Option Explicit

Private Sub Command1_Click()
    Cls                     '清屏
    Timer1.Interval = 1000  '等待1000毫秒(1秒)
    Timer1.Enabled = True   '启动定时器
    Do While Timer1.Enabled '循环等待,直到定时器Timer1停止
        DoEvents            '等待期间防止窗体“凝滞”
        Print "等待"        '提示
    Loop
    Cls                     '清屏
    Print "继续执行"        '提示:等待结束
End Sub

Private Sub Timer1_Timer()
    '定时到!停止定时器
    Timer1.Enabled = False  
End Sub

参考技术A 1.你的动作直接写到timer的代码中呀..在FORM LOAD事件中,指定好timer的interval值,并且让timer的Enabled为TRUE的

2.FOR的过程,上次也有人问了的..在FOR中, 窗体不重绘的,只有FOR完了,才一次显示窗体..所以在FOR 中print,当时是没有效果的, 只有当FOR 完时,才打印所有的

你想程序启动就开始输入数字.每2分钟输出一个数..代码应该是
Dim i%

Private Sub Form_Load()
Timer1.Interval = 120000
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Print i
i = i + 1
End Sub本回答被提问者采纳
参考技术B VB的时间不太准确,你要有思想准备。

vb中的timer\多线程有关问题

1 我想实现一个interval尽量短的timer,可是据说timer真正的最短间隔为
55ms. 那么程序中能实现的最短间隔的"时钟"是什么?
据说timeSetEvent可以1ms,但它是多媒体编程的内容,怕不方便
2 如果使用多线程的话,能不能做到:
1\完全同步?(我指的是两个线程都有2类工作,同步指的是它们同时执行第一类或第二类,希望能做到非常精确)
2\比timer的55ms更短的间隔?
3\像timer一样反复使用?直到我让它停止?
4\使用vb中的frm?控件?变量?

不太熟悉这个,麻烦高手解释,希望能给出范例!
自己已经解决了大部分问题我再提几个
1\一般我写的vb程序,cpu占用很小,内存也不多,怎样做会提高这些数值让我的程序使用更多的系统资源,或者说,系统分配给vb生成的应用程序的资源依据是什么,我想用多占用系统资源来提高我的运行速度。
2\一般1ms的时间内,能运行多少代码,就以*/运算为例
3\多线程同步如何做到,那么异步(他们精确的交替运行)。

我认为你有几点误区:
1;一个程序并不是占用系统资源越多,就运行得越快。程序要实现同一项功能,你的代码让CPU的工作量越少,系统资源占用越小,说明你的代码效率越高,程序运行速度越快。另外,CPU当前执行的线程越少,它就会有更多的资源为你需要的程序服务,因此你的程序速度也会提高。

2:1 ms 内运行多少代码? 这样说也不完全对。 CPU执行的是代码编译成的机器指令。它只认识 1 和 0 ,我们讲的CPU主频和CPU的运算速度是有一定关系的。工作在100MHz主频的CPU执行一条运算指令所需时间仅为10ns。再者,线程的优先级也会对运行速度有一定影响,但感觉不是很明显。

3:关于VB多线程的实现,给你一个网上不错的实例。
'请将该部分数据保存为 FORM1.frm 文件
VERSION 5.00
Begin VB.Form Form1
Caption = "多线程"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 6450
LinkTopic = "Form1"
ScaleHeight = 3195
ScaleWidth = 6450
StartUpPosition = 3 '窗口缺省
Begin VB.TextBox Text1
Height = 270
Left = 960
TabIndex = 2
Text = "2"
Top = 2760
Width = 2415
End
Begin VB.CommandButton Command2
Caption = "返回"
Height = 255
Left = 3480
TabIndex = 1
Top = 2760
Width = 1455
End
Begin VB.CommandButton Command1
Caption = "Start Count"
Height = 255
Left = 3480
TabIndex = 0
Top = 240
Width = 1455
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = "主线程执行结果测试:"
Height = 180
Left = 600
TabIndex = 3
Top = 2400
Width = 1710
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

Private Sub Command1_Click()
'声明了线程ID
Dim threadid1 As Long
Dim threadid2 As Long

'参数一,lpThreadAttributes 线程安全属性,传递为NULL
'参数二,dwStackSize ,线程堆栈大小,可以为0,表示堆栈和此应用堆栈相同
'参数三,lpstartAddress ,执行函数地址,用AddressOf 获取
'参数四,lpParameter ,执行函数的参数地址,可以是一个记录或者是别的类型,用VarPtr获取参数地址(varptr为未公开函数)!!
'参数五,dwCreationFlags ,表示线程创建后的状态!,0表示立即运行,create_SUSPENDED表示线程挂起
'参数六,lpThreadID 表示分配给线程的线程号
Call CreateThread(Null, ByVal O&, AddressOf Module1.OutText1, VarPtr(0), ByVal 0&, threadid1)
Call CreateThread(Null, ByVal 0&, AddressOf Module1.OutText2, VarPtr(0), ByVal 0&, threadid2)

End Sub

Private Sub Command2_Click()
'该事件运行于主线程!
Dim i As Long
i = CLng(Text1.Text)
Text1.Text = CStr(i * i) '不要点击次数太多,LONG 类型会溢出
End Sub

Private Sub Form_Load()
'保存窗体句柄全局变量,用于在form 上绘图
formhandle = Form1.hwnd
End Sub
----------------------------------
'请将该部分数据保存为 Module1.bas 文件
Attribute VB_Name = "Module1"

'线程安全属性数据结构;
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

'这个是用于多线程访问临界资源同步Api的数据结构
Public Type CRITICAL_SECTION
dummy As Long
End Type
'为什么用GDI 函数绘图?原因等下再讲
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
'请注意;createThread APi声明已被我修改过,修改的地方请自行参照APIView复制的内容
Public Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
'这个是sleep,作用就是让两个线程绘图频率不一致,效果才明显。
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) '进入临界区
Public Declare Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) '离开临界区

'几个重要的函数举例
'ObjPtr:返回对象实例私有域的地址。
'StrPtr:返回字符串第一个字的地址。
'VarPtr:返回变量的地址。

'全局的form的句柄!
Public formhandle As Long
'临界数据结构
Public sect As CRITICAL_SECTION

Sub OutText1() '过程一
Dim i As Long
Dim dc As Long
Dim s As String
dc = GetDC(formhandle) '获取窗体句柄的DC
For i = 1 To 100000
s = CStr(i)
Call SetBkColor(dc, &HF0F0F0) '设置绘制区域的背景色,也起清除作用
Call TextOut(dc, 10, 10, s, Len(s)) '输出文本!
Call Sleep(40) '等待
Next
Call ReleaseDC(formhandle, dc) '释放资源!
' Call EnterCriticalSection(sect)
' 上下表示该处为临界区,如果要对工程全局变量做操作,最好在该区域内
' 否则线程同步过程中,非常容易让程序崩溃
' Call LeaveCriticalSection(sect)
End Sub

Sub OutText2() '和过程一类似
Dim i As Long
Dim dc As Long
Dim s As String
dc = GetDC(formhandle)
For i = 1 To 100000
s = CStr(i)
Call SetBkColor(dc, &HF0F0F0)
Call TextOut(dc, 10, 80, s, Len(s)) '文本位置改变了
Call Sleep(20) '延时改变了
Next
Call ReleaseDC(formhandle, dc)
' Call EnterCriticalSection(sect)
' Call LeaveCriticalSection(sect)
End Sub

'关于为何使用gdi 函数输出文本,这是一个很重要的内容;
'程序在记数时用了难用的TextOut 函数,而没有使用标签控件,这是因为
'vb的组件不都是线程安全的,当多线程访问不是线程安全的组件,那么会
'产生严重错误。
参考技术A Timer 控制中 intelval 属性是以 ms 为单位的。

如果 intelval = 1 的话,

Sub Timer1_Timer()
End Sub

中的内容就会每 1ms 执行一次。
当然了,那个 Timer 过程的执行本身也要花费时间。

据说 Timer 真正最短的时间间隔为 55ms。小弟我也是第一次听说。

还有,你要 Timer 的目的是什么呢?
不同的目的,有不同的优化方式。

就算 Timer 达不到你的要求,也还有别的方法可以实现啊。
条条大路通罗马。

祝楼主早日成功。
参考技术B timer控件不是不能短于55MS的间隔,而是小于55MS就非常不准了,实际上超过55MS也有不准的,如果象调用高精度的时间事件,可以到网上找一个高精度时间控件,我记得有的,但忘了地址了,楼主可以自己找一下!或者可以用VB中的类来做,做一个窗体级的自定义事件,不过不是很稳定! 参考技术C TIMER本身就不是个准确的时间管理者

以上是关于vb中怎么用timer控件设置一个等待时间的主要内容,如果未能解决你的问题,请参考以下文章

vb timer控件的用法

vb的进度条怎么用?

timer怎么用?

vb怎么每隔一秒自动点击按钮

请问如何让timer控件每过一秒钟触发一次?

想用VB6.0做一个小程序,里面就一张图片,打开10秒后自动关闭.求详细制作方法,还有所需要的控件,属性设置