Что нового

Как привязать код к времени + ошибка цикла

mekez

Новичок
Сообщения
11
Репутация
0
Подскажите, в чем может быть проблема, при заключение скрипта в цикл, выдает ошибку:
"C:\Users\X\Desktop\process pause-resume.au3" (8) : ==> "While" statement has no matching "Wend" statement.:
Func _ProcessSuspend($vProcess, $iReserved = 0)
код:
Код:
$iProc = ProcessExists("Myprogram.exe")

_ProcessSuspend($iProc) ;"Заморозка" процесса
Sleep(1000)            ;Время паузы перед "разморозкой"
_ProcessResume($iProc)  ;"Разморозка" процесса

Func _ProcessSuspend($vProcess, $iReserved = 0)
    Local $iPid, $vTmp, $hThreadSnap, $ThreadEntry32, $iThreadID, $hThread, $iThreadCnt, $iThreadCntSuccess, $sFunction
    Local $TH32CS_SNAPTHREAD = 0x00000004
    Local $INVALID_HANDLE_VALUE = 0xFFFFFFFF
    Local $THREAD_SUSPEND_RESUME = 0x0002
    Local $THREADENTRY32_StructDef = "int;" _; 1 -> dwSize
             & "int;" _; 2 -> cntUsage
             & "int;" _; 3 -> th32ThreadID
             & "int;" _; 4 -> th32OwnerProcessID
             & "int;" _; 5 -> tpBasePri
             & "int;" _; 6 -> tpDeltaPri
             & "int" ; 7 -> dwFlags
    $iPid = ProcessExists($vProcess)
    If Not $iPid Then Return SetError(1, 0, False) ; Process not found.
    $vTmp = DllCall("kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPTHREAD, "int", 0)
    If @error Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
    If $vTmp[0] = $INVALID_HANDLE_VALUE Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
    $hThreadSnap = $vTmp[0]
    $ThreadEntry32 = DllStructCreate($THREADENTRY32_StructDef)
    DllStructSetData($ThreadEntry32, 1, DllStructGetSize($ThreadEntry32))
    $vTmp = DllCall("kernel32.dll", "int", "Thread32First", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
    If @error Then Return SetError(3, 0, False) ; Thread32First Failed
    If Not $vTmp[0] Then
        DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThreadSnap)
        Return SetError(3, 0, False) ; Thread32First Failed
    EndIf
    While 1
        If DllStructGetData($ThreadEntry32, 4) = $iPid Then
            $iThreadID = DllStructGetData($ThreadEntry32, 3)
            $vTmp = DllCall("kernel32.dll", "ptr", "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", False, "int", $iThreadID)
            If Not @error Then
                $hThread = $vTmp[0]
                If $hThread Then
                    If $iReserved Then
					    $sFunction = "ResumeThread"
                    Else
                        $sFunction = "SuspendThread"
                    EndIf
                    $vTmp = DllCall("kernel32.dll", "int", $sFunction, "ptr", $hThread)
                    If $vTmp[0] <> -1 Then $iThreadCntSuccess += 1
                    DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThread)
                EndIf
            EndIf
            $iThreadCnt += 1
        EndIf
        $vTmp = DllCall("kernel32", "int", "Thread32Next", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
        If @error Then Return SetError(4, 0, False) ; Thread32Next Failed
        If Not $vTmp[0] Then ExitLoop
    WEnd
    DllCall("kernel32.dll", "int", "CloseToolhelp32Snapshot", "ptr", $hThreadSnap) ; CloseHandle
    If Not $iThreadCntSuccess Or $iThreadCnt > $iThreadCntSuccess Then Return SetError(5, $iThreadCnt, $iThreadCntSuccess)
    Return SetError(0, $iThreadCnt, $iThreadCntSuccess)
EndFunc

Func _ProcessResume($vProcess)
    Local $fRval = _ProcessSuspend($vProcess, True)
    Return SetError(@error, @extended, $fRval)
 EndFunc

Делаю так:
Код:
While 1
$iProc = ProcessExists("Myprogram.exe")

_ProcessSuspend($iProc) ;"Заморозка" процесса
Sleep(1000)            ;Время паузы перед "разморозкой"
_ProcessResume($iProc)  ;"Разморозка" процесса

Func _ProcessSuspend($vProcess, $iReserved = 0)
    Local $iPid, $vTmp, $hThreadSnap, $ThreadEntry32, $iThreadID, $hThread, $iThreadCnt, $iThreadCntSuccess, $sFunction
    Local $TH32CS_SNAPTHREAD = 0x00000004
    Local $INVALID_HANDLE_VALUE = 0xFFFFFFFF
    Local $THREAD_SUSPEND_RESUME = 0x0002
    Local $THREADENTRY32_StructDef = "int;" _; 1 -> dwSize
             & "int;" _; 2 -> cntUsage
             & "int;" _; 3 -> th32ThreadID
             & "int;" _; 4 -> th32OwnerProcessID
             & "int;" _; 5 -> tpBasePri
             & "int;" _; 6 -> tpDeltaPri
             & "int" ; 7 -> dwFlags
    $iPid = ProcessExists($vProcess)
    If Not $iPid Then Return SetError(1, 0, False) ; Process not found.
    $vTmp = DllCall("kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPTHREAD, "int", 0)
    If @error Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
    If $vTmp[0] = $INVALID_HANDLE_VALUE Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
    $hThreadSnap = $vTmp[0]
    $ThreadEntry32 = DllStructCreate($THREADENTRY32_StructDef)
    DllStructSetData($ThreadEntry32, 1, DllStructGetSize($ThreadEntry32))
    $vTmp = DllCall("kernel32.dll", "int", "Thread32First", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
    If @error Then Return SetError(3, 0, False) ; Thread32First Failed
    If Not $vTmp[0] Then
        DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThreadSnap)
        Return SetError(3, 0, False) ; Thread32First Failed
    EndIf
    While 1
        If DllStructGetData($ThreadEntry32, 4) = $iPid Then
            $iThreadID = DllStructGetData($ThreadEntry32, 3)
            $vTmp = DllCall("kernel32.dll", "ptr", "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", False, "int", $iThreadID)
            If Not @error Then
                $hThread = $vTmp[0]
                If $hThread Then
                    If $iReserved Then
					    $sFunction = "ResumeThread"
                    Else
                        $sFunction = "SuspendThread"
                    EndIf
                    $vTmp = DllCall("kernel32.dll", "int", $sFunction, "ptr", $hThread)
                    If $vTmp[0] <> -1 Then $iThreadCntSuccess += 1
                    DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThread)
                EndIf
            EndIf
            $iThreadCnt += 1
        EndIf
        $vTmp = DllCall("kernel32", "int", "Thread32Next", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
        If @error Then Return SetError(4, 0, False) ; Thread32Next Failed
        If Not $vTmp[0] Then ExitLoop
    WEnd
    DllCall("kernel32.dll", "int", "CloseToolhelp32Snapshot", "ptr", $hThreadSnap) ; CloseHandle
    If Not $iThreadCntSuccess Or $iThreadCnt > $iThreadCntSuccess Then Return SetError(5, $iThreadCnt, $iThreadCntSuccess)
    Return SetError(0, $iThreadCnt, $iThreadCntSuccess)
EndFunc

Func _ProcessResume($vProcess)
    Local $fRval = _ProcessSuspend($vProcess, True)
    Return SetError(@error, @extended, $fRval)
 EndFunc
WEnd
И еще второй вопрос, самый важный))) Как этот цикл сделать, чтобы он выполнялся в заданные промежутки времени, привязав его к текущему времени на компе? Т.е. например указать время 21:00, 24:00, 7:00 и чтобы в это время, когда на компе будет 21:00, 24:00 и т.п. код выполнялся, а затем естественно все по новой :-[
 
A

Alofa

Гость
Код:
#include <WinAPI.au3>
#include <ProcessConstants.au3>

Local $sProc = 'Calc.exe'
Run($sProc) ; Пример с системным калькулятором
WinWaitActive('[CLASS:CalcFrame]')

Local $iPrev, $iCurrentTime, $aAppTime[] = ['21:00', '07:16', '23:59']

While Sleep(500)
	$iCurrentTime = (@HOUR * 60) + @MIN
	For $i = 0 To UBound($aAppTime) - 1
		If Not IsInt($aAppTime[$i]) Then
			$aSplit = StringSplit($aAppTime[$i], ':', 2)
			If UBound($aSplit) = 2 Then
				$aAppTime[$i] = ($aSplit[0] * 60) + $aSplit[1]
			Else
				ContinueLoop
			EndIf
		EndIf
		If $aAppTime[$i] = $iCurrentTime And $iPrev <> $iCurrentTime Then
			_ProcessSuspend($sProc, True) ; Приостанавливаем процесс
			Sleep(5000)
			_ProcessSuspend($sProc) ; Возобнавляем работу процесса
			$iPrev = $aAppTime[$i]
			If $iCurrentTime < $iPrev Then $iPrev = ''
		EndIf
	Next
WEnd

Func _ProcessSuspend($sProcess, $vProcSetState = False)
	Local $hProcess, $iSucess, $iPID = ProcessExists($sProcess)
	If Not $iPID Then Return SetError(1, 0, 0)
	$vProcSetState = ($vProcSetState) ? 'NtSuspendProcess' : 'NtResumeProcess'
	$hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, $iPID)
	If @error Then Return SetError(2, 0, 0)
	$iSucess = DllCall('ntdll.dll', 'int', $vProcSetState, 'int', $hProcess)
	_WinAPI_CloseHandle($hProcess)
	If Not IsArray($iSucess) Then Return SetError(3, 0, 0)
	Return 1
EndFunc   ;==>_ProcessSuspend



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

OffTopic:
mekez сказал(а):
и чему только в школе сейчас учат :rofl:
 
Автор
M

mekez

Новичок
Сообщения
11
Репутация
0
Alofa, спасибо, все работает) Про 24:00 подкола не понял - или имеется введу, что правильнее 00:00? ;D
PS А если чуть усложнить и добавить к Calc.exe еще и Notepad.exe? :smile:
 
A

Alofa

Гость
Верх