Что нового

GUICtrlSetOnEvent - нельзя выполнить параллельно несколько событий

Мишаня

Новичок
Сообщения
4
Репутация
0
Есть функция, которая выполняется пока флаг $Flag = True.
Есть GUI: кнопка старт, кнопка стоп. соответственно по нажатии кнопки Старт выполняется функция.
Для привязки событий к GUI я использую:

Код:
GUICtrlSetOnEvent($StartBtn,"StartBtn")
GUICtrlSetOnEvent($StopBtn,"StopBtn")

Func StartBtn()
    While $Flag
          ; работа
    WEnd
EndFunc

func StopBtn()
       $Flag = False
EndFunc

Естественно, этот код не работает, так как при нажатии кнопка Старт, исполняющий поток занят только выполнением функции, и хоть ты 1000 раз кликни на "Стоп", процедура только добавится в очередь ожидания и Flag никогда не станет False :(

Решение.
Предлагаю своё решение, работает, но мне не нравиться...
Вместо кнопок Старт и Стоп сделать Радио-группу с двумя положениями "старт" и "стоп". Тогда в цикле будет другое условие
Код:
While GUICtrlGetState($STOP_RADIO) = $GUI_CHECKED
     ;  работа
WEnd

Не нравиться решение просто тем, что Я ХОЧУ КНОПОЧКИ, а не радио группу.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Мишаня
Делайте работу в главном цикле. А в функциях StartBtn и StopBtn только меняйте флаг.
Код:
While 1
	Sleep(250)
	While $flag
		;работа
	WEnd
WEnd
Func StartBtn()
	$flag = True
EndFunc
Func StopBtn()
	$flag = False
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
может не так понял. вот пример. цикл можно запускать, ставить на паузу, продолжать,останавливать
Код:
Opt("GUIOnEventMode", 1)
Global $Pause, $Exit, $Start
$Form1 = GUICreate("Form1", 500, 138, 320, 316)
$Button1 = GUICtrlCreateButton("Старт", 64, 88, 75, 25)
GUICtrlSetOnEvent(-1, '_EventStart')
$Button2 = GUICtrlCreateButton("Пауза", 184, 88, 75, 25)
GUICtrlSetOnEvent(-1, '_EventPause')
$Button3 = GUICtrlCreateButton("Стоп", 296, 88, 75, 25)
GUICtrlSetOnEvent(-1, '_EventStop')
Global $Progress1 = GUICtrlCreateProgress(24, 32, 430, 17)
GUISetState()

While 1
	If $Start = 1 Then _progress()
	Sleep(100)
WEnd

Func _EventStart()
	$Start = 1
EndFunc   ;==>_EventStart

Func _progress()
	$i = 1
	While 1
		If $Pause = 1 Then
			While 1
				If $Pause = 0 Then ExitLoop
				If $Exit = 1 Then
					GUICtrlSetData($Progress1, '')
					$Start = 0
					$Exit = 0
					$Pause = 0
					Return
				EndIf
				Sleep(100)
			WEnd
		EndIf
		If $Exit = 1 Then
			GUICtrlSetData($Progress1, '')
			$Start = 0
			$Exit = 0
			$Pause = 0
			Return
		EndIf
		GUICtrlSetData($Progress1, $i)
		If $i = 100 Then
			GUICtrlSetData($Progress1, '')
			$Start = 0
			$Exit = 0
			$Pause = 0
			Return
		EndIf
		$i += 1
		Sleep(500)
	WEnd
EndFunc   ;==>_progress

Func _EventPause()
	If $Pause = 0 Then
		$Pause = 1
	Else
		$Pause = 0
	EndIf
EndFunc   ;==>_EventPause

Func _EventStop()
	$Exit = 1
EndFunc   ;==>_EventStop
 
Автор
Мишаня

Мишаня

Новичок
Сообщения
4
Репутация
0
Спасибо, ваши ответы одинаковые и рабочие :smile:
Задача решена.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Верх