Что нового

Прерывание работы функции

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Можно ли прервать выполнение функции в тот момент когда была отдана команда прерывания?
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 130, 58)
$Button1 = GUICtrlCreateButton("Button1", 25, 15, 75, 25, $WS_GROUP)
$Exit = 0
GUISetState(@SW_SHOW)
AdlibRegister("Test2", 10)

While $Exit <> 1
	Test()
WEnd
MsgBox(0,0,"!!")
Func Test()
	For $i = 0 To 9 Step 1
		GUICtrlSetData($Button1, $i)
		Sleep(1000)
	Next
EndFunc

Func Test2()
	If GUIGetMsg() = $Button1 Then $Exit = 1
EndFunc

Вот этот код работает даже после нажатия на кнопку до тех пор пока не досчитает до 9 и то он как-то криво считает, после нажатия на кнопку промежутки между сменой цифр бывает достигают нескольких секунд.
В то же время
Код:
If GUIGetMsg() = $Button1 Then Exit
прекрасно прерывает скрипт в момент нажатия кнопки, правда он из него полностью выходит, а мне нужно чтобы программа продолжила работать :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
Func Test()
    For $i = 0 To 9 Step 1
        If $Exit = 1 Then ExitLoop
        GUICtrlSetData($Button1, $i)
        Sleep(1000)
    Next
EndFunc
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
суть в том что в функции есть несколько Sleep'ов. Их конечно без труда можно заменить на циклы и вставить туда обработку этого события, но все же а что делать если этих слипов миллион?


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

Хотя наверное проще будет слип заменить отдельной функцией с таймером :smile:



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

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 130, 58)
$Button1 = GUICtrlCreateButton("Button1", 25, 15, 75, 25, $WS_GROUP)
$Exit = 0
GUISetState(@SW_SHOW)
AdlibRegister("Test2", 10)

Test()
MsgBox(0,0,"!!")

Func Test()
	While $Exit <> 1
	Test3()
	WEnd
EndFunc

Func Test2()
	If GUIGetMsg() = $Button1 Then $Exit = 1
EndFunc

Func Test3()
	For $i = 1 To 100 Step 1
		If $Exit = 1 Then ExitLoop(1)
		GUICtrlSetData($Button1, $i)
		Sleep(100)
	Next
EndFunc

Почему в этом коде иногда смена цифр на счетчике происходит не каждые 100мс, а дольше? Иногда смена цифр занимает до пол секунды.


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

Использовал TimerInit, глюки с преостановкой работы скрипта как были так и остались, но теперь они не так кретичны :smile:. Мб это изз AdlibRegister?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Belfigor сказал(а):
Почему в этом коде иногда смена цифр на счетчике происходит не каждые 100мс, а дольше?

Это потому, что GUIGetMsg() не всегда "тормозит" скрипт на одно и тоже время. В таких ситуациях лучше избавиться от этой функции и использовать сообщения.

Код:
#Include <ButtonConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

Global $Exit = False

$Form1 = GUICreate('Form1', 130, 58)
$Button1 = GUICtrlCreateButton('Button1', 25, 15, 75, 25)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState(@SW_SHOW)

Test()

MsgBox(0, 0, '!!')

Func Test()
	While Not $Exit
		Test1()
	WEnd
EndFunc   ;==>Test

Func Test1()
	For $i = 1 To 100
		If $Exit Then
			ExitLoop
		EndIf
		GUICtrlSetData($Button1, $i)
		Sleep(100)
	Next
EndFunc   ;==>Test1

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $Form1
			If (BitShift($wParam, 16) = $BN_CLICKED) And (BitAND($wParam, 0xFFFF) = $Button1) Then
				$Exit = 1
				Return 0
			EndIf
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Спасибо, испробую на досуге :smile:
 

anonymous7

Знающий
Сообщения
40
Репутация
8
А как остановить функцию если она очень длинная?
 
Верх