레이블이 멀티프로세싱인 게시물을 표시합니다. 모든 게시물 표시
레이블이 멀티프로세싱인 게시물을 표시합니다. 모든 게시물 표시

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