Modify

Opened 15 years ago

Last modified 14 months ago

#1652 assigned Bug

Sleep in TimerFunc

Reported by: hunt Owned by: Jon
Milestone: Component: AutoIt
Version: 3.3.6.0 Severity: None
Keywords: Cc:

Description

Form does not close on the first try because of sleep in TimerFunc.

#Include <Timers.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("Form", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "__Exit")
GUISetState()

_Timer_SetTimer($hGUI, 10, "__Timer")

While 1
    Sleep(10)
WEnd

Func __Timer($hWnd, $Msg, $iIDTimer, $dwTime)
	Sleep(1)
EndFunc

Func __Exit()
	_Timer_KillAllTimers($hGUI)
    Exit
EndFunc

Change History (16)

comment:1 Changed 15 years ago by hunt

I think when i trying to close script first time then script kills timer and stops before Exit. And when i trying to close script second time then script closes normally.

comment:2 Changed 15 years ago by Jpm

I found the problem. It is related really to Sleep().
The same problem can occur on ProcessWait(), ProcessWaitClose(), RunWait() RunAsWait() and ShellExecuteWait().
I intend to return failure on those when the situation occurs.

comment:3 Changed 15 years ago by anonymous

Jpm I think - this problem has not been if not executed function of timer before "Exit Function(s)". In example below TimerFunc not executes while calls function _Test in loop but executes before Exit! Why?

#Include <Timers.au3>
#include <GUIConstantsEx.au3>

Global $BeforeExit = 0

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("Form", 200, 100)
GUICtrlCreateButton("test",4,4,100,50)
GUISetOnEvent($GUI_EVENT_CLOSE, "__Exit")
GUISetState()

_Timer_SetTimer($hGUI, 10, "__Timer")


While 1
    Sleep(10)
WEnd


Func __Timer($hWnd, $Msg, $iIDTimer, $dwTime)
	If $BeforeExit = 1 Then ConsoleWrite("Entered here before Exit" & @CRLF)
	;Sleep(1)
EndFunc


Func __Exit()
	_Timer_KillAllTimers($hGUI)
	$BeforeExit = 1
	For $i = 1 to 999999
		_Test()
	Next
    Exit
EndFunc


Func _Test()
EndFunc

comment:4 Changed 15 years ago by Jpm

This ticket is referenced in revision: [5862]

comment:5 Changed 15 years ago by Jpm

  • Milestone set to 3.3.7.0
  • Owner set to Jpm
  • Resolution set to Fixed
  • Status changed from new to closed

Fixed by revision [5863] in version: 3.3.7.0

comment:6 Changed 15 years ago by Jpm

This ticket is referenced in revision: [5864]

comment:7 Changed 14 years ago by Jon

  • Resolution Fixed deleted
  • Status changed from closed to reopened

comment:8 Changed 14 years ago by TicketCleanup

  • Milestone 3.3.7.0 deleted

Automatic ticket cleanup.

comment:9 Changed 12 years ago by Jon

  • Resolution set to Rejected
  • Status changed from reopened to closed

comment:10 Changed 12 years ago by Jpm

  • Resolution Rejected deleted
  • Status changed from closed to reopened

comment:11 Changed 5 years ago by mLipok

here is my modified script:

#AutoIt3Wrapper_UseX64=Y
;~ #AutoIt3Wrapper_AutoIt3Dir="z:\AutoItPortable\AutoIt_3_3_15_3"
;~ #AutoIt3Wrapper_Aut2exe="z:\AutoItPortable\AutoIt_3_3_15_3\Aut2Exe\Aut2exe.exe"
;~ #AutoIt3Wrapper_AutoIt3="z:\AutoItPortable\AutoIt_3_3_15_3\AutoIt3.exe"

#Include <Timers.au3>
#include <GUIConstantsEx.au3>

Global $BeforeExit = 0

Opt("GUIOnEventMode", 1)

Global $hGUI = GUICreate("Form", 200, 100)
GUICtrlCreateButton("test",4,4,100,50)
GUISetOnEvent($GUI_EVENT_CLOSE, "__Exit")
GUISetState()

_Timer_SetTimer($hGUI, 10, "__Timer")


While 1
    Sleep(10)
WEnd


Func __Timer($hWnd, $Msg, $iIDTimer, $dwTime)
	#forceref $hWnd, $Msg, $iIDTimer, $dwTime
	If $BeforeExit = 1 Then ConsoleWrite("Entered here before Exit" & @CRLF)
	;Sleep(1)
EndFunc


Func __Exit()
	_Timer_KillAllTimers($hGUI)
	$BeforeExit = 1
	For $i = 1 to 999999
		_Test()
	Next
    Exit
EndFunc


Func _Test()
EndFunc

results in AutoIt 3.3.14.5 :

>Running:(3.3.14.5):Z:\AutoItPortable\App\autoit3_x64.exe "Z:\AutoItPortable\__COMUNITY\TRACK\TRACK_1652 Sleep in TimerFunc.au3"    
Entered here before Exit
!>23:16:19 AutoIt3.exe ended.rc:-1073741819

results in AutoIt 3.3.15.3 :

>Running:(3.3.15.3):z:\AutoItPortable\AutoIt_3_3_15_3\AutoIt3.exe "Z:\AutoItPortable\__COMUNITY\TRACK\TRACK_1652 Sleep in TimerFunc.au3"    
Entered here before Exit
+>23:17:30 AutoIt3.exe ended.rc:0

Is it fixed ?

EDIT: btw. in AutoIt 32bit problem is not occuring even with 3.3.14.5

Last edited 5 years ago by mLipok (previous) (diff)

comment:12 Changed 5 years ago by Jpm

I sure not as The pb mention by hunt is still true (click twice)
In the old time I propose a solution to Jon but he diskike the solution so reject the fix.
At that time I reopen the ticket so Jon can do Something he like.

comment:13 Changed 5 years ago by Jpm

  • Owner changed from Jpm to Jon
  • Status changed from reopened to assigned

comment:14 Changed 5 years ago by Jpm

  • Owner changed from Jon to Jpm

comment:15 Changed 22 months ago by anonymous

#AutoIt3Wrapper_UseX64=Y
;~ #AutoIt3Wrapper_AutoIt3Dir="z:\AutoItPortable\AutoIt_3_3_15_3"
;~ #AutoIt3Wrapper_Aut2exe="z:\AutoItPortable\AutoIt_3_3_15_3\Aut2Exe\Aut2exe.exe"
;~ #AutoIt3Wrapper_AutoIt3="z:\AutoItPortable\AutoIt_3_3_15_3\AutoIt3.exe"

#Include <Timers.au3>
#include <GUIConstantsEx.au3>

Global $BeforeExit = 0

Opt("GUIOnEventMode", 1)

Global $hGUI = GUICreate("Form", 200, 100)
GUICtrlCreateButton("test",4,4,100,50)
GUISetOnEvent($GUI_EVENT_CLOSE, "Exit")
GUISetState()

_Timer_SetTimer($hGUI, 10, "Timer")

While 1

Sleep(10)

WEnd

Func Timer($hWnd, $Msg, $iIDTimer, $dwTime)

#forceref $hWnd, $Msg, $iIDTimer, $dwTime
If $BeforeExit = 1 Then ConsoleWrite("Entered here before Exit" & @CRLF)
;Sleep(1)

EndFunc

Func Exit()

_Timer_KillAllTimers($hGUI)
$BeforeExit = 1
For $i = 1 to 999999

_Test()

Next

Exit

EndFunc

Func _Test()
EndFunc

comment:16 Changed 14 months ago by Jpm

  • Owner changed from Jpm to Jon

Both Hunt and mLipok pb solved
Fix sent to Jon

Guidelines for posting comments:

  • You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
  • In-depth discussions should take place on the forum.

For more information see the full version of the ticket guidelines here.

Add Comment

Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.