어떤 방법으로 구현이 가능할까 고민하던 중 떡~하니 보여진 UO의 글 덕분에 길이 열렸다... 지화자~~
CoProc.au3 UDF를 이용하면 멀티 프로세싱을 구현할 수 있다. 뭐.. 두개든 세개든 돌아간다는 것에 도낀개낀 해보자.. ㅋㅋㅋ
다음은 CoProc UDF에 포함된 함수 리스트이다.
;Starts another Process and Calls $sFunc, Returns PID
_SuperGlobalSet($sName,[$vValue],[$sRegistryBase])
;Sets or Deletes a Superglobal Variable
_SuperGlobalGet($sName,[$fOption],[$sRegistryBase])
;Returns the Value of a Superglobal Variable
_ProcSuspend($vProcess)
;Suspends all Threads in $vProcess (PID or Name)
_ProcResume($vProcess)
;Resumes all Threads in $vProcess (PID or Name)
_ProcessGetWinList($vProcess, $sTitle = Default, $iOption = 0)
;Enumerates Windows of a Process
_CoProcReciver([$sFunction = ""])
;Register/Unregister Reciver Function
_CoProcSend($vProcess, $vParameter,[$iTimeout = 500],[$fAbortIfHung = True])
;Send Message to Process
_ConsoleForward($iPid1, [$iPid2], [$iPid3], [$iPidn])
_ProcessEmptyWorkingSet($vPid = @AutoItPID,[$hDll_psapi],[$hDll_kernel32])
;Removes as many pages as possible from the working set of the specified process.
_DuplicateHandle($dwSourcePid, $hSourceHandle, $dwTargetPid = @AutoItPID, $fCloseSource = False)
;Returns a Duplicate handle
_CloseHandle($hAny)
;Close a Handle
예제 파일도 포함되어 있지만.. 멀티 프로세스로 잘 돌아가는지 좀더 확실히 확인해 보고싶어 _CoProc()함수를
아래와 같이 수정해 봤다.
#include "CoProc.au3"
$iProc2Pid = _CoProc("_proc2", "notepad.exe")
$iProc3Pid = _CoProc("_Proc2", "regedit.exe")
sleep(500)
Func _Proc2($vParam)
runwait($vParam)
MsgBox(0, '', 'close')
EndFunc ;==>_Proc2
AutoIt 3.3.0.0 버전을 사용한다면 RunErrorsFatal 예약어가 삭제되었으므로
아래와 같이 CoPorc.au3파일을 수정할 필요가 있다.
Func _CoProc($sFunction = Default, $vParameter = Default)
Local $iPid, $iOldRunErrorsFatal
If IsKeyword($sFunction) Or $sFunction = "" Then $sFunction = "__CoProcDummy"
;$iOldRunErrorsFatal = Opt("RunErrorsFatal", 0)
EnvSet("CoProc", "0x" & Hex(StringToBinary ($sFunction)))
EnvSet("CoProcParent", @AutoItPID)
If Not IsKeyword($vParameter) Then
EnvSet("CoProcParameterPresent", "True")
EnvSet("CoProcParameter", StringToBinary ($vParameter))
Else
EnvSet("CoProcParameterPresent", "False")
EndIf
If @Compiled Then
$iPid = Run(FileGetShortName(@AutoItExe), @WorkingDir, @SW_HIDE, 1 + 2 + 4)
Else
$iPid = Run(FileGetShortName(@AutoItExe) & ' "' & @ScriptFullPath & '"', @WorkingDir, @SW_HIDE, 1 + 2 + 4)
EndIf
If @error Then SetError(1)
;Opt("RunErrorsFatal", $iOldRunErrorsFatal)
Return $iPid
EndFunc ;==>_CoProc
이제 겨우 _CoProc()함수 익히고, _SuperGlobalGet(), _SuperGlobalSet(), _ProcessGetWinList()함수 정도 이해했다..;;
아직 갈길이 너무 멀어 ㅠ.ㅠ
trackback from: CoProc, 오토잇에서 멀티프로세싱을 도와줍니다.
답글삭제http://www.autoitscript.com/forum/index.php?showtopic=29326오토잇에서는 절대로 멀티쓰레딩을 돌려서는 안됩니다. (억지로 돌리고 보면 반복문 돌릴때 맛가버리거든요. ㅠ;)그래서 멀티프로세싱을 해야 하는데, 이걸 도와주는 UDF가 CoProc 입니다.매우 예전에 작성된 글인 만큼 현 오토잇 3.3.0.0 에서는 정상작동하지 않습니다.그래서 이를 약간 수정해야 하는데, 예전에 제가 UO에 작성해뒀던 글은 날...