Что нового

Как выполнить функцию в отдельном процессе\потоке?

ak40u

Знающий
Сообщения
33
Репутация
7
Как вынести функцию _ping() в отдельный процесс или поток?

Код:
;Область произвольного кода
;=========
_ping()
;продолжение произвольного кода
;=========
Func _ping()
Do
	$ping = Ping("iog-office.dyndns.org")
        sleep(500)
Until $ping>0
return 1
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#NoTrayIcon

If ($CmdLine[0]) And ($CmdLine[1] = '/ping') Then
    Do
        Sleep(500)
    Until Ping($CmdLine[2])
    Exit
EndIf

Opt('TrayIconHide', 0)

Global $Pid = 0

OnAutoItExitRegister('AutoItExit')

;Область произвольного кода

If @compiled Then
    $Pid = Run(@ScriptFullPath & ' /ping iog-office.dyndns.org')
Else
    $Pid = Run(@AutoItExe & ' "' & @ScriptFullPath & '" ' & ' /ping iog-office.dyndns.org')
EndIf

;Продолжение произвольного кода

While ProcessExists($Pid)
    Sleep(100)
WEnd

$Pid = 0

MsgBox(0, 'Ping', 'OK!')

Func AutoItExit()
	If $Pid Then
		ProcessClose($Pid)
	EndIf
EndFunc   ;==>AutoItExit
 
Автор
A

ak40u

Знающий
Сообщения
33
Репутация
7
Спасибо, но мне хотелось бы научиться выносить любую функцию из тела скрипта в отдельный процесс без предварительной ее доработки.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Отдельный процесс - это отдельный исполняемый файл (отдельная программа). Просто так (без доработки) функцию вынести в отдельный процесс не получится. Все зависит от конкретного случая. Если уж очень хочется, можно по ходу выполнения основной программы создать временный скрипт в TEMP папке и запустить его.

Потоки AutoIt не поддерживает.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Можно в таком духе.
Запускаем скрипт по новой, при этом передаём название функции в параметре, запускаем её с помощью Call().

Код:
If $cmdline[0] Then
	For $i = 1 To $cmdline[0]-1 Step +1
		If $cmdline[$i] = '/call' Or $cmdline[$i] = '-call' Then
			Call($cmdline[$i+1])
			Exit
		EndIf
	Next
EndIf

If @compiled Then
    $Pid = Run(@ScriptFullPath & ' /call testfunc')
Else
    $Pid = Run(@AutoItExe & ' "' & @ScriptFullPath & '" ' & ' /call testfunc')
EndIf

Func testfunc()
	MsgBox(0, '', '')
EndFunc
 
Верх