Timer控件与多线程问题

metaphy 2006-10-19 04:26:12
我在调用某一过程的时候,因时间较长,需要给用户以"正在操作"的提示,想用Timer做成动态的形式.
现在有一个问题,就是在调用的时候,Timer 似乎不响应,即使加上DoEvents,情况也没好多少,哪位能指点一二?



Private Sub Command7_Click()
Dim i

Text1.Visible = True 'Text1---显示提示信息,操作完成后即隐藏
Timer1.Interval = 1000
Timer1.Enabled = True
DoEvents
DoEvents

For i = 0 To 1000000000
'空循环,表示其他动作
Next i

Timer1.Enabled = False
Text1.Visible = False

End Sub

Private Sub Timer1_Timer()
Text1.Text = Text1.Text & " ·"
If Len(Text1.Text) > 10 + 6 * 2 Then Text1.Text = "正在进行操作,请稍候"
End Sub
...全文
270 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
metaphy 2006-10-19
  • 打赏
  • 举报
回复
不是吧,dll是现有的,不能改了
Dunzip 2006-10-19
  • 打赏
  • 举报
回复
Call some_dll(gCommonInfo, stru, 0, gErrorInfo) '这个dll 可能需要执行比较长的时间

这句很关键,如果DLL没有设计好,就会独占本线程CPU时间,其他语句就无法执行了。

metaphy 2006-10-19
  • 打赏
  • 举报
回复
不是吧?
VB 处理不了?
laviewpbt 2006-10-19
  • 打赏
  • 举报
回复
从你的 DLL文件入手了
metaphy 2006-10-19
  • 打赏
  • 举报
回复
楼上的解决方法确实很有效.大家都是在循环内部加 DoEvents
可能大家理解错了.
实际代码并不是调循环,而是调用一个dll函数.

Private Sub Command7_Click()
Dim i

Text1.Visible = True 'Text1---显示提示信息,操作完成后即隐藏
Timer1.Interval = 1000
Timer1.Enabled = True

Call some_dll(gCommonInfo, stru, 0, gErrorInfo) '这个dll 可能需要执行比较长的时间

Timer1.Enabled = False
Text1.Visible = False

End Sub

这样情况该如何加 DoEvents?

p.s. 在timer1_timer() 里面加不起作用.
GoldFox 2006-10-19
  • 打赏
  • 举报
回复
在Timer1_Timer()事件里也加上DoEvents语句
laviewpbt 2006-10-19
  • 打赏
  • 举报
回复
对与再大循环里 加入 DoEvents却是可以使应用程序响应其他程序,但是 DoEvents也会很大程度上影响循环的速度,所以一般情况我这样用
If GetInputState Then DoEvents
虽然多了个判断语句,但速度上确快了很多

比较以下代码代码就知道了速度的差别

Private Declare Function GetInputState Lib "user32" () As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()
Dim s As Long
s = GetTickCount
For i = 1 To 1000000
DoEvents
Next
MsgBox GetTickCount - s
End Sub

Private Sub Command2_Click()
Dim s As Long
s = GetTickCount
For i = 1 To 1000000
If GetInputState Then DoEvents
Next
MsgBox GetTickCount - s
End Sub
jinyt 2006-10-19
  • 打赏
  • 举报
回复
Private Sub Command7_Click()
Dim i

Text1.Visible = True 'Text1---显示提示信息,操作完成后即隐藏
Timer1.Interval = 1000
Timer1.Enabled = True
DoEvents
DoEvents

For i = 0 To 1000000000
'空循环,表示其他动作

DoEvents 'add source

Next i

Timer1.Enabled = False
Text1.Visible = False

End Sub

Private Sub Timer1_Timer()
Text1.Text = Text1.Text & " ·"
If Len(Text1.Text) > 10 + 6 * 2 Then Text1.Text = "正在进行操作,请稍候"
End Sub

--------------------------------------------------------------------------------
由此可见,Timer1_Timer()事件还是在这个线程里的
jinyt 2006-10-19
  • 打赏
  • 举报
回复
Private Sub Command7_Click()
Dim i

Text1.Visible = True 'Text1---显示提示信息,操作完成后即隐藏
Timer1.Interval = 1000
Timer1.Enabled = True
DoEvents
DoEvents

For i = 0 To 1000000000
'空循环,表示其他动作

DoEvents 'add source

Next i

Timer1.Enabled = False
Text1.Visible = False

End Sub

Private Sub Timer1_Timer()
Text1.Text = Text1.Text & " ·"
If Len(Text1.Text) > 10 + 6 * 2 Then Text1.Text = "正在进行操作,请稍候"
End Sub

--------------------------------------------------------------------------------
由此可见,Timer1_Timer()事件还是在这个函数里的
zq972 2006-10-19
  • 打赏
  • 举报
回复
Private Sub Command7_Click()
Dim i

Text1.Visible = True 'Text1---显示提示信息,操作完成后即隐藏
Timer1.Interval = 1000
Timer1.Enabled = True

For i = 0 To 1000000000
DoEvents
'空循环,表示其他动作
Next i

Timer1.Enabled = False
Text1.Visible = False

End Sub
Private Sub Timer1_Timer()
text1.selstart=len(text1.text)'这样处理也比较快点
Text1.selText = " ·"
If Len(Text1.Text) > 10 + 6 * 2 Then Text1.Text = "正在进行操作,请稍候"
End Sub
metaphy 2006-10-19
  • 打赏
  • 举报
回复
anybody here1?

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧