是这样,我写的一段试验小程序  就一个窗口 上面两个按钮 和一个定时器。 一个按钮的名字是“开始”(也就是启动定时器),另一个按钮是“停止”(中止停时器)
 我的定时器定的是500ms(这个值经我试验比较合适)。我那个定时器里干的事是监督正在运行本程序以外的其它程序的用途,比如说“记事本”或者“计算器”等等。 现在有一个问题,程序开始运行。我按下开始按钮,启动定时器,但是这个时候我发现 那个“停止”的钮无法按下去,好象有点闪,我得按好几次才能把它按下去中止。 我要移动我这个程序的窗口的标题栏想把他变换一个屏幕的位置也不行。偶尔可以移动一点我想可能也是刚从定时器中跳出来,移一点马上又进入定时器执行去了,所以无法响应。 定时器里的程序也不复杂。    大概的结构是这样:先是几行赋值语句 以后是 一个小循环 次数我知道60次左右。如(for i=1 to 60), 接下来是一个判断语句
  if AAAA  then  BBBB  个AAAA的信息从前面那60次的小循环里得到,BBBB 也是执行循环60次 后面就没有什么了,有几个小判断,if CCC then DDD 等等。如果AAAA不成立就退出timer了。 就这是么简单的结构。 
   我的定时间隔我以为定得太频繁了,后来我改成半秒一次还是不行。这个值不能再大了,目前是正好的。我只是想在启动定时器的时候在本程序中还能进行其它操作,如果按“停止”钮和移动标题栏等操作。 后来我听了某人的说法,说是应该使用DoEvents, 但我不知道如何应用于本例。我在网上找到的DoEvents 用法好象都不适用我啊。我不知道我这个程序结构里在哪里加上这一句话。
   我是一个初学者,这个问题困扰我一个星期了,我实在想不出来了,想各位前辈请教,谢谢!

解决方案 »

  1.   

    加在你的循环的next前面,判断的外边,另外,可能是时间间隔太短了
      

  2.   


    原来群里那个人是你呀.你这功能何必搞得这么复杂.把DoEvents放在你的循环里面试一下.
      

  3.   

    在你的Timer事件中一进入, 开始处理事件前应先将Timer1.enabled=False 完事后再True在Timer1事件里面如有For..Next 或 Do...Loop 要在循环里面加个退出FLAG 例如我的ForceStop'添加 Command1  Command2  Timer1Dim i&, j&, aa&, bb&, MousX%, MousY%, ForceStop As Boolean, MoveScreen As BooleanPrivate Sub Form_Load()
       Timer1.Interval = 100
       Timer1.Enabled = False
       Command1.Caption = "开 始"
       Command2.Caption = "停 止"
    End SubPrivate Sub Command1_Click()
       Randomize
       ForceStop = False
       Timer1.Enabled = True
    End SubPrivate Sub Command2_Click()
       ForceStop = True
    End SubPrivate Sub Timer1_Timer()
       Timer1.Enabled = False
       Me.Cls
       For i = 1 To 60
          aa = Int(Rnd * 100)
          For j = 1 To aa
             bb = Int(Rnd * 100)
             Print CStr(aa) & " " & CStr(bb)
             If ForceStop Then
                Timer1.Enabled = False
                Me.Cls
                MsgBox "强迫停止"
                Exit Sub
             End If
          Next j
       Next i
       Timer1.Enabled = True
    End SubPrivate Sub command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If Button = 1 Then
          MoveScreen = True
          MousX = X: MousY = Y
       End If
    End SubPrivate Sub command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If MoveScreen Then
          CurrX = Command1.Left - MousX + X
          CurrY = Command1.Top - MousY + Y
          Command1.Move CurrX, CurrY
       End If
    End SubPrivate Sub command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       MoveScreen = False
    End Sub
      

  4.   

    因为你的这个For...Next才60 很短,所以我不加DoEvents,加上DoEvents会降低事件处理速度,如果你的这循环很大便应该加上 DoEventsFor i = 1 To 60
          aa = Int(Rnd * 100)
          For j = 1 To aa
             bb = Int(Rnd * 100)
             'DoEvents
             Print CStr(aa) & " " & CStr(bb)
             If ForceStop Then
                Timer1.Enabled = False
                Me.Cls
                MsgBox "强迫停止"
                Exit Sub
             End If
          Next j
       Next i
      

  5.   


    For i = 1 To 60 
    '加一句
    if i mod 20 =0 then DoEvents
    '你的代码

          
    Next i
      

  6.   

     非常感谢 几位高人的解答,新手昨天刚注册第一次提问,没想到这里的人这么热心。  在循环里加 DoEvents我试过了,不管用。
    cbm666 给出的示例很好, 我试过了。 在他的指导下,现在那个stop钮可以按下了, 但是窗口的标题栏我还是拖不动,不过比以前强很多,以前是一点都移不动,现在至少可以移动个5CM,然后马上又回到原位置,呵呵。 不管怎么说比以前是有进步, 可能问题还在我,我再找找吧,再一次谢谢几位老师,尤其是cbm666。
      

  7.   

    窗口的标题栏我还是拖不动 ?'*****************************************移动窗体API
    Private Declare Function ReleaseCapture Lib "user32" () As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
    Const WM_NCLBUTTONDOWN = &HA1
    Const HTCAPTION = 2
    '*****************************************************
    Dim i&, j&, aa&, bb&, MousX%, MousY%, ForceStop As Boolean, MoveScreen As BooleanPrivate Sub Form_Load()
       Timer1.Interval = 100
       Timer1.Enabled = False
       Command1.Caption = "开 始"
       Command2.Caption = "停 止"
    End SubPrivate Sub Command1_Click()
       Randomize
       ForceStop = False
       Timer1.Enabled = True
    End SubPrivate Sub Command2_Click()
       ForceStop = True
    End SubPrivate Sub Timer1_Timer()
       Timer1.Enabled = False
       Me.Cls
       For i = 1 To 60
          aa = Int(Rnd * 100)
          For j = 1 To aa
             bb = Int(Rnd * 100)
             'DoEvents
             Print CStr(aa) & " " & CStr(bb)
             If ForceStop Then
                Timer1.Enabled = False
                Me.Cls
                MsgBox "强迫停止"
                Exit Sub
             End If
          Next j
       Next i
       Timer1.Enabled = True
    End SubPrivate Sub command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If Button = 1 Then
          MoveScreen = True
          MousX = X: MousY = Y
       End If
    End SubPrivate Sub command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If MoveScreen Then
          CurrX = Command1.Left - MousX + X
          CurrY = Command1.Top - MousY + Y
          Command1.Move CurrX, CurrY
       End If
    End SubPrivate Sub command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       MoveScreen = False
    End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If Button = 1 Then
          Call ReleaseCapture
          Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
       End If
    End Sub