Modify

Opened 15 years ago

Closed 15 years ago

#1944 closed Bug (No Bug)

AdlibUnRegister not working trusty

Reported by: Devol Owned by:
Milestone: Component: AutoIt
Version: 3.3.6.1 Severity: None
Keywords: Cc:

Description

Hello,

Here an example:

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)

Global $Label, $iPos = 0 , $sleep = 10

$Form1 = GUICreate("Adlibtest - Sleep("&$sleep&")", 240, 100, 990, 30)
GUISetOnEvent(-3, "_Exit")
$Label = GUICtrlCreateLabel("Testlabel", 25, 14, 300, 16)
GUICtrlSetFont(-1, 11, 800, 0, "MS Sans Serif")
$Button1 = GUICtrlCreateButton("Start",15,50,60,40)
GUICtrlSetOnEvent(-1,"_startadlib")
$Button2 = GUICtrlCreateButton("Stop",120,50,60,40)
GUICtrlSetOnEvent(-1,"_stopadlib")
GUISetState(@SW_SHOW)

While Sleep($sleep) ; the higher the sleep , the more often the labelswitch fails
WEnd

Func _startadlib()
GUICtrlSetData($Label,"Running")
AdlibRegister("_Laufschrift")
EndFunc

Func _stopadlib()
AdlibUnRegister("_Laufschrift")
GUICtrlSetData($Label,"Stopped") ; labelswitch failing sometimes 
EndFunc

Func _Exit()
    Exit
EndFunc

Func _Laufschrift()
    GUICtrlSetData($Label, StringMid("Running", $iPos) & "           " & "Running")
    $iPos += 1.8
    If $iPos > StringLen("Running") Then $iPos = 0
EndFunc

I tested this script on several pcs but the behavoir is always the same.
AdlibUnRegister

sometimes

fails and the subsequent command is not being executed.

You can try the examplescript , just click the buttons "Start" and "Stop" by turns.(wait 1-2 secs. before clicking stop)
Sooner or later the label will be stopped on "Running Running Running" despite of the GuictrlsetData($Label,"Stopped").

Bug or not? :)

Greetz Devol

PS: I talked to the german forum before opening this ticket.

Attachments (0)

Change History (11)

comment:1 by BrewManNH, 15 years ago

It's working for me, every time I hit Stop, it changes the label to Stopped. I even put the sleep at 1 second and still no issues with it.

in reply to:  1 comment:2 by anonymous, 15 years ago

Replying to BrewManNH:

It's working for me, every time I hit Stop, it changes the label to Stopped. I even put the sleep at 1 second and still no issues with it.

Sorry i had problems with the edit-function , the sleep doesn`t really matter , use 50ms to try , the error really exists(tested with some user in the german forum before) , the problem is that it appears randomly.

comment:3 by mvg, 15 years ago

  • Random: General ratio might be helpful here. (1:2, 1:10, etc)
  • System: Some system data on the PC's you have encountered this problem. (like "Environment(Language:0413 Keyboard:00000409 OS:WIN_XP/Service Pack 3 CPU:X86 OS:X86)"( SciTE4AutoIT3,scriptmode)

    PS: I talked to the german forum before opening this ticket.

  • Link: So it seems ... http://www.autoit.de/index.php?page=Thread&threadID=27479

comment:4 by mvg, 15 years ago

O yea ... your reporting on 3.3.6.1. If you can, see if the current latest beta 3.3.7.x(you fill in the x) is also giving you the same problem/error.

in reply to:  4 comment:5 by Devol, 15 years ago

Replying to mvg:

O yea ... your reporting on 3.3.6.1. If you can, see if the current latest beta 3.3.7.x(you fill in the x) is also giving you the same problem/error.

So , the error also appears in beta v3.3.7.8, tested on Win7 Prof. SP1 x64 , WinXP Prof. SP2/3 x86.

comment:6 by mvg, 15 years ago

@dev's
Thanks for having me on delayed viewing.

comment:7 by Devol, 15 years ago

@dev`s
Did someone already took a look on it?

comment:8 by J-Paul Mesnage, 15 years ago

From my point of view there is no bug but just a race condition.
When the AdlibUnRegister is requested the previous execution can be just beginning. No way to stop it but the GUICtrlSetData($Label,"Stopped") will be overwrite with the end of execution of _Laufschrift()
some global variable can be set to reflect that we want to stop or ad a slight delay before executing GUICtrlSetData($Label,"Stopped") that will force the execution of the previous Adlib.
Remember AutoIt is not multithreaded so Adlib is executing between statements

Func _stopadlib()
AdlibUnRegister("_Laufschrift")
Sleep(500)
GUICtrlSetData($Label,"Stopped") ; labelswitch failing sometimes 
EndFunc

comment:9 by Devol, 15 years ago

Sorry , but the Sleep doesn`t solve the problem(just tried it).
AdlibUnregister should stop a registered function to be executed, right?
So what if it`s important that an function really needs to be stopped?
In my opinion it`s a bug, sry..

in reply to:  9 comment:10 by Devol, 15 years ago

Replying to Devol:

Sorry , but the Sleep doesn`t solve the problem(just tried it).
AdlibUnregister should stop a registered function to be executed, right?
So what if it`s important that an function really needs to be stopped?
In my opinion it`s a bug, sry..

It only works with global variables:

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)

Global $Label, $iPos = 0 , $sleep = 30 , $schalter

$Form1 = GUICreate("Adlibtest - Sleep("&$sleep&")", 240, 100, 990, 30)
GUISetOnEvent(-3, "_Exit")
$Label = GUICtrlCreateLabel("Testlabel", 25, 14, 300, 16)
GUICtrlSetFont(-1, 11, 800, 0, "MS Sans Serif")
$Button1 = GUICtrlCreateButton("Start",15,50,60,40)
GUICtrlSetOnEvent(-1,"_startadlib")
$Button2 = GUICtrlCreateButton("Stop",120,50,60,40)
GUICtrlSetOnEvent(-1,"_stopadlib")
GUISetState(@SW_SHOW)

While Sleep($sleep) ; the higher the sleep , the more often the labelswitch fails
WEnd

Func _startadlib()
GUICtrlSetData($Label,"Running")
$schalter=0
AdlibRegister("_Laufschrift")
EndFunc

Func _stopadlib()
$schalter = 1
AdlibUnRegister("_Laufschrift")
GUICtrlSetData($Label,"Stopped") ; labelswitch failing sometimes
EndFunc

Func _Exit()
    Exit
EndFunc

Func _Laufschrift()
	If 	$schalter = 1 Then Return
    GUICtrlSetData($Label, StringMid("Running", $iPos) & "           " & "Running")
    $iPos += 1.8
    If $iPos > StringLen("Running") Then $iPos = 0
EndFunc

comment:11 by J-Paul Mesnage, 15 years ago

Resolution: No Bug
Status: newclosed

I agree that a global is "the solution" but the sleep can work in some case at least on my system.
There is nothing with the current implementation of AutoIt that we can do inside AutoIt.
You need to use Global to avoid such interaction between Adlib's

Modify Ticket

Action
as closed The ticket will remain with no owner.

Add Comment


E-mail address and name can be saved in the Preferences .
 
Note: See TracTickets for help on using tickets.