Что нового

Соединить три бесконечных цикла

Сообщения
30
Репутация
-1
Собственно вопрос в названии, как грамотно соединить три бесконечных цикла,

Код:
#include <Clipboard.au3>
	  
	$sProcessString = IniRead(@ScriptDir & '\Settings.ini', 'Process', 'ProcessString', 'mspaint.exe')
	  
	While 1
	    Sleep(100)
	    $Memo = _ClipBoard_GetData()
	    If $Memo = 0 And @extended = 0 Then
	        $pid = WinGetProcess('[ACTIVE]', '')
	        $sName = _ProcessName($pid)
	        If Not StringInStr($sProcessString, $sName) Then ClipPut('')
	    EndIf
	WEnd
	  
	Func _ProcessName($pid)
	    If IsString($pid) Then $pid = ProcessExists($pid)
	    If Not IsNumber($pid) Then Return -1
	    $proc = ProcessList()
	    For $p = 1 To $proc[0][0]
	        If $proc[$p][1] = $pid Then Return $proc[$p][0]
	    Next
	    Return -1
	EndFunc   ;==>_ProcessName

Код:
#include <Array.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet('{ESC}', '_Exit')

Global $iWait_MS = 250
Global $aTitle = StringSplit('CabinetWClass|Progman|WorkerW', '|')

While Sleep(10)
	If _IsPressed(1) Then
		Sleep($iWait_MS)
		
		If _IsPressed(1) Then
			Local $tPoint = _WinAPI_GetMousePos()
			Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
			Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)
			
			If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
				MouseUp('Main')
			EndIf
		EndIf
	EndIf
WEnd

Func _Exit()
    Exit
EndFunc

Код:
While 1
	WinClose("[TITLE:Подтверждение удаления;CLASS:#32770]", "")
	ControlClick("Предупреждение диспетчера задач", "", "[CLASS:Button; INSTANCE:2]")
	Sleep(2)
WEnd

чтобы они работали одновременно и не теряли в скорости
 
Автор
B
Сообщения
30
Репутация
-1
Ясно, но это не совсем то, что мне нужно. Мне тогда будет проще запускать сразу три exe файла, или два.

Сделал таки, такой вопрос
Код:
AdlibRegister('Copy',500)

While 1
	WinClose("[TITLE:Подтверждение удаления;CLASS:#32770]", "")
	ControlClick("Предупреждение диспетчера задач", "", "[CLASS:Button; INSTANCE:2]")
	Sleep(10)
	If _IsPressed(1) Then
		Sleep($iWait_MS)
		
		If _IsPressed(1) Then
			Local $tPoint = _WinAPI_GetMousePos()
			Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
			Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)
			
			If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
				MouseUp('Main')
			EndIf
		EndIf
	EndIf
WEnd

  Func Copy()
		    Sleep(20)
	    $Memo = _ClipBoard_GetData()
	    If $Memo = 0 And @extended = 0 Then
	        $pid = WinGetProcess('[ACTIVE]', '')
	        $sName = _ProcessName($pid)
	        If Not StringInStr($sProcessString, $sName) Then ClipPut('')
	    EndIf
	EndFunc	  
	  
	Func _ProcessName($pid)
	    If IsString($pid) Then $pid = ProcessExists($pid)
	    If Not IsNumber($pid) Then Return -1
	    $proc = ProcessList()
	    For $p = 1 To $proc[0][0]
	        If $proc[$p][1] = $pid Then Return $proc[$p][0]
	    Next
	    Return -1
	EndFunc   ;==>_ProcessName


когда срабатывает AdlibRegister, скрипт с while прерывается?
и какое время для AdlibRegister лучше выбрать?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
206
Код:
#include <Clipboard.au3>
#include <Array.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet('{ESC}', '_Exit')

Global $iWait_MS = 250
Global $aTitle = StringSplit('CabinetWClass|Progman|WorkerW', '|')
Global $sProcessString = IniRead(@ScriptDir & '\Settings.ini', 'Process', 'ProcessString', 'mspaint.exe')

While Sleep( 10 )
	$Memo = _ClipBoard_GetData()
	If $Memo = 0 And @extended = 0 Then
		$pid = WinGetProcess('[ACTIVE]', '')
		$sName = _ProcessName($pid)
		If Not StringInStr($sProcessString, $sName) Then ClipPut('')
	EndIf
    If _IsPressed(1) Then
        Sleep($iWait_MS)

        If _IsPressed(1) Then
            Local $tPoint = _WinAPI_GetMousePos()
            Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
            Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)

            If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
                MouseUp('Main')
            EndIf
        EndIf
    EndIf
	WinClose("[TITLE:Подтверждение удаления;CLASS:#32770]", "")
    ControlClick("Предупреждение диспетчера задач", "", "[CLASS:Button; INSTANCE:2]")
WEnd

Func _ProcessName($pid)
	If IsString($pid) Then $pid = ProcessExists($pid)
	If Not IsNumber($pid) Then Return -1
	$proc = ProcessList()
	For $p = 1 To $proc[0][0]
		If $proc[$p][1] = $pid Then Return $proc[$p][0]
	Next
	Return -1
EndFunc   ;==>_ProcessName

Func _Exit()
    Exit
EndFunc


Так а что мешает их топорно соединить?
 
Автор
B
Сообщения
30
Репутация
-1
firex сказал(а):
Код:
#include <Clipboard.au3>
#include <Array.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet('{ESC}', '_Exit')

Global $iWait_MS = 250
Global $aTitle = StringSplit('CabinetWClass|Progman|WorkerW', '|')
Global $sProcessString = IniRead(@ScriptDir & '\Settings.ini', 'Process', 'ProcessString', 'mspaint.exe')

While Sleep( 10 )
	$Memo = _ClipBoard_GetData()
	If $Memo = 0 And @extended = 0 Then
		$pid = WinGetProcess('[ACTIVE]', '')
		$sName = _ProcessName($pid)
		If Not StringInStr($sProcessString, $sName) Then ClipPut('')
	EndIf
    If _IsPressed(1) Then
        Sleep($iWait_MS)

        If _IsPressed(1) Then
            Local $tPoint = _WinAPI_GetMousePos()
            Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
            Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)

            If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
                MouseUp('Main')
            EndIf
        EndIf
    EndIf
	WinClose("[TITLE:Подтверждение удаления;CLASS:#32770]", "")
    ControlClick("Предупреждение диспетчера задач", "", "[CLASS:Button; INSTANCE:2]")
WEnd

Func _ProcessName($pid)
	If IsString($pid) Then $pid = ProcessExists($pid)
	If Not IsNumber($pid) Then Return -1
	$proc = ProcessList()
	For $p = 1 To $proc[0][0]
		If $proc[$p][1] = $pid Then Return $proc[$p][0]
	Next
	Return -1
EndFunc   ;==>_ProcessName

Func _Exit()
    Exit
EndFunc


Так а что мешает их топорно соединить?

один из скриптов начинает подгружать проц, не сильно, но всеравно.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
bradu

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Администратор.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
206
bradu
Тогда используйте
Код:
TimerDiff
для необходимого участка ( скрипта ).
 

firex

AutoIT Гуру
Сообщения
943
Репутация
206
bradu
Код:
Global $iTime
While Sleep( 10 )
    If Not $iTime Or TimerDiff( $iTime ) >= 100 Then
        $iTime = TimerInit()
        ; ---
        ConsoleWrite( "100 ms..." & @CRLF )
    EndIf
WEnd
 
Автор
B
Сообщения
30
Репутация
-1
Сделал вот так:
Код:
While 1
	 If TimerDiff($start1) > 10 then
	WinClose("[TITLE:Подтверждение удаления;CLASS:#32770]", "")
	ControlClick("Предупреждение диспетчера задач", "", "[CLASS:Button; INSTANCE:2]")
	Sleep(10)
	If _IsPressed(1) Then
		Sleep($iWait_MS)
		
		If _IsPressed(1) Then
			Local $tPoint = _WinAPI_GetMousePos()
			Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
			Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)
			
			If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
				MouseUp('Main')
			EndIf
		EndIf
	EndIf
	$start1 = TimerInit()
EndIf
		If TimerDiff($start2) > 100 then
	    $Memo = _ClipBoard_GetData()
	    If $Memo = 0 And @extended = 0 Then
	        $pid = WinGetProcess('[ACTIVE]', '')
	        $sName = _ProcessName($pid)
	        If Not StringInStr($sProcessString, $sName) Then ClipPut('')
			EndIf
		$start2 = TimerInit()	
		EndIf
		sleep(5)
WEnd

это правильно?
 
Верх