Что нового

[Баг] Краш приложения при использовании UDF GDIpProgress

Heler

Знающий
Сообщения
70
Репутация
11
При нажатии на крестик получаю краш приложения.

Пример:

Код:
#include <GDIpProgress.au3>

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("Program", 300, 117, -1, -1, -1)
$pBar = _ProgressCreate(25, 38, 250, 30)
_ProgressSetText($pBar, ":)")
GUISetState()

GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

While 1
Sleep(25)
WEnd

Func _Exit()
	_ProgressDelete($pBar)
	_Progress_CallBack_Free(1)
	_GDIPlus_Shutdown()
	EXIT
EndFunc


AutoIT 3.3.6.1 OS:WIN_7 CPU:X64 OS:X64
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это не имеет отношения непосредственно к AutoIt, т.к. GDIpProgress UDF не входит в его состав. Разработчик этой библиотеки - Prog@ndy. Можешь написать ему об этом, если есть желание. Но суть проблемы в том, что при использовании режима OnEvent, функции обработки могут быть вызваны в любой момент и в любом месте программы (собственно поэтому, я и не люблю этот режим в AutoIt). Зависания происходят в те моменты, когда выход из программы инициируется внутри Callback-функции - _Paint_Bars_Procedure(). В этом случае автоматически освобождаются все Callback-функции, в том числе и _Paint_Bars_Procedure(), которая фактически еще не закончила свою работу. Избежать этого можно следующим образом:

Код:
#Include <GDIpProgress.au3>

Opt("GUIOnEventMode", 1)

Global $ExitFlag = False

$hGUI = GUICreate("Program", 300, 117, -1, -1, -1)
$pBar = _ProgressCreate(25, 38, 250, 30)
_ProgressSetText($pBar, ":)")
GUISetState()

GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

While 1
	Sleep(100)
	If $ExitFlag Then
		_ProgressDelete($pBar)
		_Progress_CallBack_Free(1)
		Exit
	EndIf
WEnd

Func _Exit()
	$ExitFlag = True
EndFunc   ;==>_Exit



Добавлено:
Сообщение автоматически объединено:

Поправил GDIpProgress UDF, в аттаче.
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
Спасибо за пример, но он мне не подходит. У меня есть функция которая выполняется длительное время. Планировал выполнять ее в While. Закрывание программы через:
Код:
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

А нажатие кнопок через:
Код:
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

Это все было придумано что бы я мог контролировать процессом выполнения функции, которая выполняется примерно 5 мин. Но тут такая неприятная ситуация :smile:

После исправления Вами UDF также получаю краш :(

Добавлено:

После исправления Вами UDF скрипт работает без крашей только в 32-битном режиме. Что меня вполне устраивает. Но автору UDF я написал ;)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Heler
Я такие ситуации у себя решал двумя способами.
1-ый - дезактивировать крестик закрытия на время работы функции с помощью
Код:
#include <GUIMenu.au3>
;...
 $hMenu = _GUICtrlMenu_GetSystemMenu($Form1)
_GUICtrlMenu_EnableMenuItem($hMenu, $SC_CLOSE, 2)
; ваша функция
_GUICtrlMenu_EnableMenuItem($hMenu, $SC_CLOSE, 0)
Так при кликанье по крестику окно закроется только после выполнения функции.
2-й способ - использую стиль окна $WS_POPUP и в правом верхнем углу делаю свою кнопку закрытия, которую делаю не активной во время работы функции.
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
madmasles, спасибо. Будем пробовать. :smile:
 
Верх