在程序中用了一个Timer控件。每次Timer执行的时间比较长。
但如果在Timer执行的过程中,企图关闭程序,就会执行form_unload。但我发现form_unload不能将timer的程序停止执行。造成了程序已经关闭,但实际上还留在内存中继续执行的问题。
我该怎么处理在timer执行时企图关闭程序的问题?
但如果在Timer执行的过程中,企图关闭程序,就会执行form_unload。但我发现form_unload不能将timer的程序停止执行。造成了程序已经关闭,但实际上还留在内存中继续执行的问题。
我该怎么处理在timer执行时企图关闭程序的问题?
========
真是不可思意
在窗体的query事件中加timer1.enabled=false可以试试.
--的方法没问题
现在的问题像是这个样子:timer运行中,企图关闭程序,执行form_unload,关闭timer,程序退出。但没有执行完的tiemr继续执行,但因为form已经unload,会再次form_load一次,造成timer继续执行、留在内存中,不会停止
我以前也遇到过
后来好象是改的interval
让这个值尽量小些
哈哈
unload me
TIMER会有这个问题吗?
在执行的带有FOR或DO中加入DOEVENTS试试
....
也许是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
bCancel=True '可以直接让目标过程停止,不用等了
Cancel = 1
Do While Not m_trend
DoEvents
Loop
Cancel = 0
End Sub
在Unload中加上这个标志判断、循环以后,会不停地执行这个循环。而Timer似乎在此期间不再执行,也就是不会修改这个标志。造成这个循环不停地执行下去,成了死循环
我想应该是因为Unload的执行优先级比较高的问题,但不知道怎么才能修改优先级。
编写有关timer执行体的状态代码
'关闭内存中的窗体
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