在程序中用了一个Timer控件。每次Timer执行的时间比较长。
但如果在Timer执行的过程中,企图关闭程序,就会执行form_unload。但我发现form_unload不能将timer的程序停止执行。造成了程序已经关闭,但实际上还留在内存中继续执行的问题。
我该怎么处理在timer执行时企图关闭程序的问题?

解决方案 »

  1.   

    在窗体的query事件中加timer1.enabled=false可以试试.
      

  2.   

    造成了程序已经关闭(end),但实际上还留在内存中继续执行的问题。
    ========
    真是不可思意
      

  3.   

    dabie() ( ) 信誉:100    Blog   加为好友  2007-04-20 16:38:00  得分: 0  
     
     
       在窗体的query事件中加timer1.enabled=false可以试试.
      
     
    --的方法没问题
      

  4.   

    我一直有timer1.enable=false的,但不起作用
    现在的问题像是这个样子:timer运行中,企图关闭程序,执行form_unload,关闭timer,程序退出。但没有执行完的tiemr继续执行,但因为form已经unload,会再次form_load一次,造成timer继续执行、留在内存中,不会停止
      

  5.   

    这个问题是个问题
    我以前也遇到过
    后来好象是改的interval
    让这个值尽量小些
    哈哈
      

  6.   

    timer1.enable=false
    unload me
      

  7.   

    ?!
    TIMER会有这个问题吗?
    在执行的带有FOR或DO中加入DOEVENTS试试
      

  8.   

    这个问题现在我也遇到过很多,程序开始进行Unload事件了,但在Timer事件中的代码还没有返回,这个时候,如果你设置Timer为False是不能让还有执行的Timer事件停止的。我想应该这样做:在Timer完成之后应该设置一个变量,在Unload事件中等待他的设置,为真之后,再结束程序。使用DoEvents只会让程序更加莫明其妙。如果那个Timer事件在一定时间不返回的话,可以考虑使用End结束程序(保证程序做好的清除工作)。
      

  9.   

    确实有这样的问题?
    ....
    也许是TIMER用的...............
    那这样做,设置一全局变量.当TIMER过程开始时设置为F,结束时设置为T,在UNLOAD中进行循环判断
    类似如下代码Dim m_trend As Boolean
    Private Sub Form_Unload(Cancel As Integer)
    Cancel = 1
    Do While Not m_trend
        DoEvents
    Loop
    Cancel = 0
    End SubPrivate Sub Timer1_Timer()
    m_trend = False'………………
    '中间代码
    '………………m_trend = True
    End Sub
      

  10.   

    如果这样不行,还是建议你用代码回收内存(SET XX=NOTHING),查找是否有未回收的句柄等.
      

  11.   

    同意zcsor(偶业余的斗胆写点blog(IE表单自动填写相关内容更新ing) 的意见我也认为,关键不是在那里.....关键应该是在于TIMER事件里执行的那个过程.但LS那样还不怎么完善,因为程序退出时还是要等那个过程执行完,费时间.我来锦上添花一下:)同LS一样,定义一个全局变量,用于判断过程是否处理完;不过还要再加一个"是否结束程序"的变量:private bCancel as Boolean然后在那个TIMER里的过程中,加入对bCancel变量的判断.也就是说,那个过程退出的条件就增加了一个:一,过程处理完毕;二,bCancel=True相应的,在LS的UNLOAD代码基础上,还要这样一下:Private Sub Form_Unload(Cancel As Integer)
    bCancel=True         '可以直接让目标过程停止,不用等了
    Cancel = 1
    Do While Not m_trend
        DoEvents
    Loop
    Cancel = 0
    End Sub
      

  12.   

    这些方法我以前都试过,不起作用
    在Unload中加上这个标志判断、循环以后,会不停地执行这个循环。而Timer似乎在此期间不再执行,也就是不会修改这个标志。造成这个循环不停地执行下去,成了死循环
      

  13.   

    现在看起来是这个问题:Timer运行到某一行A,点击关闭程序,Timer不再继续执行,开始执行Unload,在Unload执行结束后,回到Timer的A+1行继续执行,同时因为已经Form_Unload,所以又Form_Load了一次。
    我想应该是因为Unload的执行优先级比较高的问题,但不知道怎么才能修改优先级。
      

  14.   

    在程序关闭时用END会侧底的关了程序也可用于其它的循环
      

  15.   

    在Query_unload()事件中
    编写有关timer执行体的状态代码
      

  16.   

    要彻底清除内存中的进程,可用下面代码:
    '关闭内存中的窗体
    Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Private Declare Function GetWindowThreadProcessId Lib "USER32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Const PROCESS_TERMINATE = 1
    Private Sub Form_Unload(Cancel As Integer)
        UnHook Me.hWnd
    If Not form1 Is Nothing Then
    Unload form1
    End If
    If Not form2 Is Nothing Then
    Unload form2
    End If
    If Not form3 Is Nothing Then '如果还有其它窗体,继续往下写同样格式的代码
    Unload form3
    End If
    End Sub