Войти

Показать полную графическую версию : GUI, обработка функций вместе с ним.


SyDr
24-05-2009, 12:35
Есть GUI, а также некоторые функции, которые работают достаточно долго, от нескольких секунд, до нескольких часов.
В связи с этим мне нужна остановка выполнения функции (но не выход из скрипта). Причём не только по горячей клавише. но и через GUI

Примерная структура скрипта:
;Create GUI

While 1
GUIProcess()
WEnd

Func GUIProcess()
Switch GUIGetMsg()
;...
Case $ButtonStop
$NotStop=0
EndSwitch
EndFunc

Func Some()
While 1 And $NotStop
;...
GUIProcess()
WEnd
EndFunc

Собственно вопрос, насколько это эффективно? И есть ли решение получше?
http://www.autoitscript.com/forum/index.php?showtopic=95510 - здесь вроде бы то, что мне надо, но к сожалению, я не понял, как этим воспользоваться :(

Twix1124
24-05-2009, 15:40
while 1
Switch GUIGetMsg()
;...
Case $ButtonStop
Stop()
EndSwitch
wend

Func Stop()
;create GUI 2
While 1
sleep(100)
Switch GUIGetMsg2()
;...
Case $Continue
exitloop()
EndSwitch
WEnd
EndFunc

Мне кажется так можно=)

beve
24-05-2009, 15:42
В связи с этим мне нужна остановка выполнения функции (но не выход из скрипта) »
Мне кажеться это можно реализовать только если основной скрипт будет 1 программа, а каждая длинная функция вторая, третья и т. д. программа. Потом запускать на выполнение нужной функции (программы) из основного скрипта, а как наладить "внутреннюю связь" между двумя прогами, чтоб можно было получать/передавать сообщения, здесь на форуме недавно обсуждалось.Собственно вопрос, насколько это эффективно? »Если твоя функция запустится на выполнение и она будет выполнятся скажем 10 минут, а в процессе работы ты нажмеш на кнопку отмены, то отменить ее выполнение по твоему примеру, не удасться пока не пройдут эти 10 минут, потом только лишь на второй круг выполнения функция не пойдет...ибо была отмена.

SyDr
24-05-2009, 16:14
Ну... Если бы у меня было что-то типо Sleep(n) - я бы даже не спрашивал и плюнул бы на это дело. А так, моя функция работает долго за счёт скачки файлов из интернета. Но качаю я то их в фоне. Поэтому и имею возможность при этом обрабатывать GUI.
То есть вот эта функция вызывыается достаточно часто:
Func GetSourceOrFile($URL, $SourceOrFile = "Source", $PathToDownLoad = "") ; Готово
#cs ----------------------------------------------------------------------------
Готово.
Внешние связи: #include <File.au3>, переменная $AllowDownLoad для немедленного завершения и цикл обработки GUI {GUIProcess()}
Получает файл или исходный текст файла в интернете. При этом обрабатывает GUI
Возвращаемое значение: Исходный текст файла или пустая строка
#ce ----------------------------------------------------------------------------
Local $Handle
Local $Return = ""

If $PathToDownLoad = "" Then $PathToDownLoad = _TempFile()
$Handle = InetGet($URL, $PathToDownLoad, 0, 1)

While (NOT(InetGetInfo($Handle, 2))) And $AllowDownLoad
GUIProcess()
WEnd

InetClose($Handle)

If $SourceOrFile = "Source" Then
$Return = FileRead($PathToDownLoad)
FileDelete($PathToDownLoad)
EndIf

Return $Return
EndFunc

Twix1124
24-05-2009, 16:38
моя идея подойдёт - в функции паузы создать создать такую же форму или форму с кнопкой продолжить...

Creat0R
24-05-2009, 18:21
У меня есть утилита работающая похожим образом. Для отмены действии (функции) я использую глобальную переменную, которой присваивается значение True если необходимо остановить функцию, а в самой функции в критичных местах проверяю эту переменную.

здесь вроде бы то, что мне надо, но к сожалению, я не понял, как этим воспользоваться »
Насколько я понимаю, это запускает функцию из Dll'ки в отдельном участке памяти (процессе), вызвать так функцию из самого скрипта наврядли получится, разве что только если скрипт скомпилирован, и то придётся искать указатель на функцию в процессе... но память (моя :) ) мне подсказывает что в аутоите это невозможно...




© OSzone.net 2001-2012