Что нового

Баг IsArray()

Prog

Продвинутый
Сообщения
537
Репутация
65
Запустите скрипт и закройте окно кнопкой в заголовке.
Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Sound.au3>

Opt("GUIOnEventMode", 1)

Global $g_Param=1234
Global $g_pTimerHandler = DllCallbackRegister("TimerFunc", 'none', 'hwnd;uint;uint_ptr;dword')

$hMainGUI = GUICreate("", 300, 300, -1, -1)
GUISetState()

_WinAPI_SetTimer($hMainGUI, 2, 100, DllCallbackGetPtr($g_pTimerHandler))
GUISetOnEvent($GUI_EVENT_CLOSE, "Close")

While 1
   Sleep(100)
wend

Func Close()
    _WinAPI_KillTimer($hMainGUI, 2)
    Exit
EndFunc

func TimerFunc($hWnd, $iMsg, $idEvent, $iTickCount)
    #forceref hWnd, $iMsg, $idEvent, $iTickCount
    if IsArray($g_Param) Then
        ConsoleWrite("Bug" & @crlf)
    endif
EndFunc
С чего-то вдруг выполняется условие
Код:
if IsArray($g_Param) Then
притом что $g_Param это не массив!
Много времени потратил чтобы найти причину. Скрипт виснет при закрытии окна без сообщения об ошибке.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
В функции Close пропишите
DllCallbackFree($g_pTimerHandler)
 
Автор
P

Prog

Продвинутый
Сообщения
537
Репутация
65
Это ничего не изменило.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
у меня работает без ошибок. Использовал ваш код.
 
Автор
P

Prog

Продвинутый
Сообщения
537
Репутация
65
В консоли редактора AutoIt появляется слово "Bug"?
Если да, то это и есть ошибка. Ведь $g_Param это не массив.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Я понял вашу проблему, но у меня она не проявилась. Я запускал и в редакторе и после компиляции. Окно быстро закрывается и процесс прекращает работу. В консоли редактора не появляется bug
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
func TimerFunc($hWnd, $iMsg, $idEvent, $iTickCount)
    #forceref hWnd, $iMsg, $idEvent, $iTickCount
	Local $arr=IsArray($g_Param)
    if $arr Then
        ConsoleWrite("Bug" & @crlf)
    endif
EndFunc

Так нет срабатывания.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include <WinAPIex.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Sound.au3>

Opt("GUIOnEventMode", 1)

Global $g_Param=1234
Global $g_pTimerHandler = DllCallbackRegister("TimerFunc", 'none', 'hwnd;uint;uint_ptr;dword')

$hMainGUI = GUICreate("", 300, 300, -1, -1)
GUISetState()
Global $j
_WinAPI_SetTimer($hMainGUI, 2, 100, DllCallbackGetPtr($g_pTimerHandler))
GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
While 1
   Sleep(100)
wend

Func Close()
	GUISetState(@SW_HIDE)
	DllCallbackFree($g_pTimerHandler)
_WinAPI_KillTimer($hMainGUI, 2)
	ConsoleWrite($j&'@@@@@@@@@@@@@@@' & @LF)
    Exit
EndFunc

func TimerFunc($hWnd, $iMsg, $idEvent, $iTickCount)
    #forceref hWnd, $iMsg, $idEvent, $iTickCount
	$j+=1
	ConsoleWrite($j&'###### '&IsArray($g_Param) & @LF)
    if IsArray($g_Param) Then
        ConsoleWrite($j&"Bug" & @crlf)
    endif
EndFunc
IsArray тут непричём, после вызова Close() TimerFunc срабатывает ещё раз, причём криво.
 
Верх