2009년 2월 2일 월요일

AutoIt에서 멀티 프로세싱 구현

AutoIt으로 요즘 구상중인 프로젝트를 구현하려고 보니 멀티 스레드의 필요성이 팍팍~

어떤 방법으로 구현이 가능할까 고민하던 중 떡~하니 보여진 UO의 글 덕분에 길이 열렸다... 지화자~~

CoProc.au3 UDF를 이용하면 멀티 프로세싱을 구현할 수 있다. 뭐.. 두개든 세개든 돌아간다는 것에 도낀개낀 해보자.. ㅋㅋㅋ

다음은 CoProc UDF에 포함된 함수 리스트이다.


test.au3_CoProc([$sFunction],[$vParameter])
    ;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()함수를
아래와 같이 수정해 봤다.


test.au3#NoTrayIcon
#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()함수 정도 이해했다..;;
아직 갈길이 너무 멀어 ㅠ.ㅠ

댓글 1개:

  1. trackback from: CoProc, 오토잇에서 멀티프로세싱을 도와줍니다.
    http://www.autoitscript.com/forum/index.php?showtopic=29326오토잇에서는 절대로 멀티쓰레딩을 돌려서는 안됩니다. (억지로 돌리고 보면 반복문 돌릴때 맛가버리거든요. ㅠ;)그래서 멀티프로세싱을 해야 하는데, 이걸 도와주는 UDF가 CoProc 입니다.매우 예전에 작성된 글인 만큼 현 오토잇 3.3.0.0 에서는 정상작동하지 않습니다.그래서 이를 약간 수정해야 하는데, 예전에 제가 UO에 작성해뒀던 글은 날...

    답글삭제