Что нового

Как запустить функцию, без задежки на выполнение скрипта.

demon_m

Новичок
Сообщения
15
Репутация
0
Проблема состоит в том, что есть резидентные функции, результат которых не влияет на остальной програмный код.
Но приходится ждать завершения этой функции, чтобы продолжилось выполнение программы. Как запускать функцию no wait (без ожидания).
PS Прошу прощение у модераторов, если неправильно разместил тему.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
возможно, запускать в вспомогательном скрипте
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Это можно сделать только используя дополнительный процесс скрипта, но с очень значительным ограничением - дочерний процесс не будет иметь доступ к библиотекам/опциям/переменным родительского скрипта.


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

Хотя в нескомпилированном скрипте (ну и если сильно постараться то и в скомпилированном) это можно (грубо) обойти, методом копирования содержимого скрипта в новый скрипт, с мелким изменением, где будет обрабатываться ком. строка (ну или другой любой метод для интеракций и передачи данных между скриптами) для запуска указанной функций.


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

Хотя нет, что то я сильно прогнал :laugh:
Предыдущую идею можно также удачно реализовать с одним лишь скриптом (и не имеет значения, будет он скомпилирован или нет), просто запускать его снова с ком. строкой, а в начале поставить соответствующую обработку.

А вот унаследовать текущие установки и значения переменных исходного скрипта врядли получится, это нужно копать память, и причём довольно глубоко, и главное - почти неизвестно что нужно искать.
 
Автор
D

demon_m

Новичок
Сообщения
15
Репутация
0
Очень хотелось бы посмотреть пример скрипта, выложите пожалуйста. И еще. Можно запускать через RUN с параметрами??? Если да, то как? Понимаю, что как вариант можно использовать ini. Есть еще варианты???
 

bic

Знающий
Сообщения
46
Репутация
14
Пример запуска с параметрами.
http://autoit-script.ru/index.php?topic=979.msg6960#msg6960
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
у меня только через файл получилось, но даже тут можно через один файл передавать много параметров и проверять их в другом одновременно.

это скомпилировать в func.exe то есть как бы и будет наша функция сама по себе отдельным файлом:
Код:
#include <file.au3>
#NoTrayIcon
$i = 0
_FileCreate("test.txt")
For $i = 0 To 1000
   IniWrite("test.txt", "Func", "func", $i)
   Sleep(1000)
Next


а это сам скрип:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$fFunc = @ScriptDir &"\func.exe"
$hGUI = GUICreate("hGUI", 350, 100, 200, 110)
$Func = GUICtrlCreateButton("Func", 250, 60, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
ShellExecute($fFunc)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         ProcessClose("func.exe")
         Exit

      Case $Func
         $sInfo = IniRead("test.txt", "Func", "func", "NotFound")
         Dim $iMsg
         $iMsg = MsgBox(266308, "Func info", "Данные с Func: " & $sInfo & @CRLF & "" & @CRLF & "Хотите очистить данные?")
         Select
            Case $iMsg = 6 ;Yes
               FileDelete("test.txt")
               ProcessClose("func.exe")
               ShellExecute($fFunc)
            Case $iMsg = 7 ;No
         EndSelect
   EndSwitch
WEnd

можно добавить секций и ключей в ini файле и через них таким образом организовать интеракцию :smile:




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


инет лагает поправил код немного.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вариант №1:

Код:
#include <File.au3>

$sReadIncl = _
	'#NoTrayIcon' & @CRLF & _
	'ConsoleWrite("Return from Line #" & @ScriptLineNumber & ": " & TestFunc("Test"))' & @CRLF & _
	'ConsoleWrite("Return from Line #" & @ScriptLineNumber & ": " & MsgBox(36, "", "Are you sure?"))' & @CRLF & _
	'Func TestFunc($sParam)' & @CRLF & _
	'	Return $sParam' & @CRLF & _
	'EndFunc'

$sRet = _AutoIt3ExecuteCode($sReadIncl)

ConsoleWrite($sRet)

Func _AutoIt3ExecuteCode($sCode)
	Local $sTmpFile = _TempFile(@TempDir, "~AutoIt3ExecuteCode_")
	FileWrite($sTmpFile, $sCode)
	
	Local $iPID = Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteScript "' & $sTmpFile & '"', @WorkingDir, 0, 2)
	Local $sStdOut_Read = "", $sStdOut_Ret = ""
	
	While 1
		$sStdOut_Read = StdoutRead($iPID)
		If @error <> 0 Then ExitLoop
		
		If $sStdOut_Read <> "" Then $sStdOut_Ret &= $sStdOut_Read & @CRLF
		
		Sleep(10)
	WEnd
	
	FileDelete($sTmpFile)
	
	Return $sStdOut_Ret
EndFunc


Вариант №2:

Код:
;Check the command line at start time
#OnAutoItStartRegister "_CheckCmdLine_Proc"

;Here we just check if it's a first run, with no command line parameters
If $CmdLine[0] = 0 Then
	$iAsk = MsgBox(36, 'Question', 'Execute function?')
	If $iAsk = 6 Then _ExecuteSubFunction('_MyFunc', 'Some data')
EndIf

Func _MyFunc($sParams)
	MsgBox(64, '_MyFunc Call', $sParams)
EndFunc

Func _ExecuteSubFunction($sFuncName, $sParams)
	If @Compiled Then
		Run(@AutoItExe & ' "' & $sFuncName & '" "' & $sParams & '"')
	Else
		Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptFullPath & '" "' & $sFuncName & '" "' & $sParams & '"')
	EndIf
EndFunc

Func _CheckCmdLine_Proc()
	If $CmdLine[0] >= 2 Then
		Call($CmdLine[1], $CmdLine[2])
	EndIf
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ну еще есть UDF для этого.
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Ваши методы очень сложные! :smile:
Вот простой пример без UDF и т.п.
Код:
AdlibRegister("Test",1)
ToolTip("Test",0,0,"AutoIt3",1)


Func Test()
	AdlibUnRegister("Test")
	MsgBox(0,"AutoIt3","Test")
	Sleep(5000)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
SECTOR [?]
Вот простой пример без UDF и т.п.
Этот пример не решает поставленой задачи:

Код:
AdlibRegister("Test", 3000)

$i = 0

While 1
	$i += 1
	
	ConsoleWrite($i & @CRLF)
	Sleep(1000)
WEnd

Func Test()
    AdlibUnRegister("Test")
    MsgBox(0,"AutoIt3","Test, loop is paused")
    Exit
EndFunc
 
Верх