Что нового

Ускорить запуск скрипта

Tosyk

Новичок
Сообщения
206
Репутация
0
Что я пытаюсь выполнить?
Ускорить выполнение скрипта

Как я это пытался/ась выполнить?
сделал скрипт, вот он:

Код:
#include <File.au3>
;~ #include <MsgBoxConstants.au3>
#Include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

AutoItSetOption("MustDeclareVars", 1)
HotKeySet("{ESC}", "Terminate")


Local $i
Local $sSourceFile, $sDestFile, $sRunWait, $sParams, $iMax, $sNewFileName, $Form1, $ProgressBar1, $Label, $Progress, $Progress1, $gamVal, $CheckKeepAlpha, $v1
Local $sDrive, $sFolder, $sFileName, $sExt

Local $sIMConv = 'magick.exe', $sIMPathFull = 'C:\Program Files\ImageMagick\', $sIMPath = FileGetShortName($sIMPathFull & $sIMConv) ; path to image magick tools

Local $Exts = "tga|jpg|bmp|dds|png|tif|jpeg", $sPattern = "\.(?i:" & $Exts & ")"  ; supported input file extensions

Local $ExtOutput = "png"

If $CmdLine[0] <> 0 Then
   If FileExists($sIMPath) Then
	  ProcessFiles()
   Else
	  MsgBox(0, $sIMConv & " not found", "File [" & $sIMPathFull & $sIMConv & "] not found" & @CRLF)
	  ConsoleWrite("Download Image Magick: " & $sIMConv & " to use this tool." & @CRLF)
   EndIf
Else
   MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
   ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Func ProcessFiles()
   #Region ### START Koda GUI section ### Form=
   $Form1 = GUICreate("Converting files...", 300, 185, -1, -1);, $WS_POPUP) ;, $WS_EX_TOOLWINDOW)
   Local $Group1 = GUICtrlCreateGroup("Set gamma", 8, 5, 284, 56)
   $gamVal = GUICtrlCreateInput("1.3", 20, 28, 260, 22)
   $CheckKeepAlpha = GUICtrlCreateCheckbox("Keep alpha channel", 20, 68, 200, 17)
   $Label = GUICtrlCreateLabel("", 20, 94, 220, 20, $SS_LEFT) ;, $WS_EX_TOPMOST)
   $Progress1 = CreateProgress(20, 115, 260, 20)
   Local $Button1 = GUICtrlCreateButton("Start", 206, 150, 75, 25)
   GUISetState(@SW_SHOW)

   #EndRegion ### END Koda GUI section ###

   While 1
	  Switch GUIGetMsg()
		 Case $GUI_EVENT_CLOSE
			ExitLoop
		 Case $Button1
			ExitLoop
	  EndSwitch
   WEnd

   For $i = 1 To $CmdLine[0]
	  $sSourceFile = $CmdLine[$i]
	  _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)
	  GUICtrlSetData($ProgressBar1, ($i / $CmdLine[0]) * 100)

	  If FileExists($sSourceFile) Then
		 If StringRegExp($sExt, "\A" & $sPattern & "\z", 0) = 1 Then
			Settings() ; function of settings
			ConsoleWrite("Full converting path: " & $sRunWait & @LF)
			RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
		 Else
			ProgressOff()
			MsgBox(0, "Incorrect extension", "Extension of file [" & $sFileName & "] is [" & $sExt & "] and not in [" & $Exts & "]" & @CRLF)
			ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
		 EndIf
	  Else
		 ConsoleWriteError("File [" & $sSourceFile & "] not found" & @CRLF)
	  EndIf
	  UpdateProgress($Progress1, ($i / $CmdLine[0]) * 100)
	  GUICtrlSetData($Label, $sFileName & $sExt)
	  Sleep(650)
   Next
   GUICtrlSetData($Label, "Converting complete")
   Sleep(1000)
EndFunc   ;==>ProcessFiles

Func Settings()
   If _IsChecked($CheckKeepAlpha) Then
	  $v1 = ' '
   Else
	  $v1 = ' ' & '-alpha off' & ' '
   EndIf

   $sSourceFile = '"' & $sSourceFile & '"'
   $sParams = '-gamma' & ' ' & GUICtrlRead($gamVal) & ',' & GUICtrlRead($gamVal) & ',' & GUICtrlRead($gamVal) & $v1 & '-colorspace sRGB'
   $sNewFileName = ($sFileName & '.' & $ExtOutput)
   $sDestFile = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sNewFileName & '"'

   $sRunWait = $sIMPath & " " & $sSourceFile & " " & $sParams & " " & $sDestFile
EndFunc   ;==>Settings

;---------------------------------------------------------------
;- Enhanced Progress widget
;---------------------------------------------------------------
Func CreateProgress($x, $y, $w, $h, $Label="")
	  Dim $Progress[2]
	  $Progress[0] = GuiCtrlCreateProgress($x, $y, $w, $h) ; this is progress bar
	  $Progress[1] = GuiCtrlCreateLabel($Label, $x+0, $y-21, '', '', $SS_RIGHT) ; this is percentage label
	  GUICtrlSetFont($Progress[1], 11, 500, 0, "")
	  GUICtrlSetBkColor($Progress[1], $GUI_BKCOLOR_TRANSPARENT)
	  Return $Progress
EndFunc

Func UpdateProgress($ProgressID, $Percent, $Label="")
	  GUICtrlSetData($ProgressID[0], $Percent)
	  GUICtrlSetData($ProgressID[1], $Label & Round($Percent, 1) & "%")
   EndFunc

Func _IsChecked($idControlID)
    Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func Terminate()
   Exit
EndFunc   ;==>Terminate

Exit(0)


однако же мой старый скрипт для этого действия работает сразу, без паузы. вот он:

Код:
#Include <File.au3>

AutoItSetOption("MustDeclareVars", 1)

Local $i
Local $sSourceFile, $sDestFile
Local $sDrive, $sFolder, $sFileName, $sExt

Local $sPattern = "\.(?i:tga|jpg|bmp|dds|png|tif|jpeg)"

If $CmdLine[0] <> 0 Then
	If FileExists("C:\Program Files\ImageMagick\convert.exe") Then
		ProgressOn("Converting", "", "0%")

		For $i = 1 To $CmdLine[0]
			$sSourceFile = $CmdLine[$i]

			ProgressSet(($i / $CmdLine[0]) * 100, $sFileName & $sExt, String(Round($i / $CmdLine[0] * 100, 1)) & "%")

			If FileExists($sSourceFile) Then
				_PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)

				If StringRegExp($sExt, "\A" & $sPattern & "\z", 0) = 1 Then
					 $sDestFile = _PathMake($sDrive, $sFolder, $sFileName, ".png")
					 RunWait("""" & "C:\Program Files\ImageMagick\convert.exe "" """ & $sSourceFile & """ -gamma 1.3,1.3,1.3 -colorspace sRGB """ & $sDestFile & """", "", @SW_HIDE)
				Else
					ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
				EndIf
			Else
				ConsoleWriteError("File [" & $sSourceFile & "] not found" & @CRLF)
			EndIf
		Next

		ProgressSet(100 , "Converting complete", "100%")

		Sleep(1000)
		ProgressOff()
	EndIf
Else
	MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
	ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit(0)


Что я ожидаю от выполненных действии?
чтобы когда я нажимаю на Start скрипт бы не подвисал на пару секунд, а выполнялся моментально

Что происходит на самом деле?
после нажатия на кнопку Start окно какое-то время думает и только потом начинает обрабатывать файлы.

p.s.: конвертирование происходит через этот файл: https://drive.google.com/file/d/1vI8oNmvdQLtA7AikkGJvPplHXFwnidVZ/view?usp=sharing
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
никто не знает? неужели за знания, которые я приобрёл и с помощью которых написал более продвинутый скрипт оборачиваются против меня?
меня действительно напрягает эта задержка. может быть удалить все функции и переписать скрипт?

edit: похоже скрипт начинает тормозить если я использую GUICreate() и CreateProgress(). возможно я просто не понимаю как ими правильнее распорядиться. подскажите пожалуйста, похоже из-за этого работа встала :-[
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
похоже скрипт начинает тормозить если я использую GUICreate()
Попробуйте создать GUI при старте скрипта скрытым и уже в функции не создавать GUI , а показывать ранее скрытое окно
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
чтобы когда я нажимаю на Start скрипт бы не подвисал на пару секунд, а выполнялся моментально
А откуда уверенность что скрипт подвисает?
Что если поставить msgbox перед ExitLoop? если сработает сразу (в чём я уверен), то проблема в самом цикле.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А если так:

Код:
Func ProcessFiles()
	#Region ### START Koda GUI section ### Form=
	$Form1 = GUICreate("Converting files...", 300, 185, -1, -1) ;, $WS_POPUP) ;, $WS_EX_TOOLWINDOW)
	Local $Group1 = GUICtrlCreateGroup("Set gamma", 8, 5, 284, 56)
	$gamVal = GUICtrlCreateInput("1.3", 20, 28, 260, 22)
	$CheckKeepAlpha = GUICtrlCreateCheckbox("Keep alpha channel", 20, 68, 200, 17)
	$Label = GUICtrlCreateLabel("", 20, 94, 220, 20, $SS_LEFT) ;, $WS_EX_TOPMOST)
	$Progress1 = CreateProgress(20, 115, 260, 20)
	Local $Button1 = GUICtrlCreateButton("Start", 206, 150, 75, 25)
	GUISetState(@SW_SHOW)
	#EndRegion ### END Koda GUI section ###
	
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				ExitLoop
			Case $Button1
				For $i = 1 To $CmdLine[0]
					$sSourceFile = $CmdLine[$i]
					_PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)
					
					If FileExists($sSourceFile) Then
						If StringRegExp($sExt, "\A" & $sPattern & "\z", 0) = 1 Then
							Settings() ; function of settings
							ConsoleWrite("Full converting path: " & $sRunWait & @LF)
							RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
						Else
							MsgBox(0, "Incorrect extension", "Extension of file [" & $sFileName & "] is [" & $sExt & "] and not in [" & $Exts & "]" & @CRLF)
							ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
						EndIf
					Else
						ConsoleWriteError("File [" & $sSourceFile & "] not found" & @CRLF)
					EndIf
					
					UpdateProgress($Progress1, ($i / $CmdLine[0]) * 100)
					GUICtrlSetData($Label, $sFileName & $sExt)
					;Sleep(650)
				Next
				
				GUICtrlSetData($Label, "Converting complete")
				ExitLoop
		EndSwitch
	WEnd
	
	Sleep(1000)
EndFunc
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
CreatoR сказал(а):
спасибо, но я уже как-только не тасовал все функции. в итоге вообще их все выпилил, объединил в один код и при замене ProgressOn() на GUICreate() + CreateProgress() появляется эта проблема

ra4o сказал(а):
Попробуйте создать GUI при старте скрипта скрытым и уже в функции не создавать GUI , а показывать ранее скрытое окно
а как это сделать? как его скрывать? да и подвисает не рендер GUI, а начало работы процесса внутри уже нарисованного GUI

CreatoR сказал(а):
Tosyk [?]А откуда уверенность что скрипт подвисает?
1. перетягиваю любую картинку на EXE (или прямо в редакторе в режиме отладки)
2. открывается окно GUI
3. жму кнопку Start и выполнение не происходит 2 секунды или около того. после этого процесс выполняется как и должен

вот что он там делает 2 секунды? почему такая задержка? второй, более простой скрипт, то же самое начинает выполнять мгновенно

CreatoR сказал(а):
Tosyk [?]Что если поставить msgbox перед ExitLoop? если сработает сразу (в чём я уверен), то проблема в самом цикле.
после отработки процесса сразу появляется сообщение
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
после отработки процесса сразу появляется сообщение
Процесс не должен начаться если msgbox поставлен перед выходом из цикла.
Ты явно делаешь что то не так, ты пробовал мой вариант функции? Я там убрал обращение к неиспользуемым переменным, просто подмени эту функцию в коде и попробуй.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Да, я всё попробовал. вот мой текущий вариант и он тоже тупит перед началом выполнения операции.

Код:
#include <File.au3>
#Include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

If Not $CmdLine[0] Then
	MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
	ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
	Exit
EndIf

AutoItSetOption("MustDeclareVars", 1)
HotKeySet("{ESC}", "Terminate")

Local $i ; input file
Local $sSourceFile, $sDestFile, $sRunWait, $sParams, $sNewFileName, $Form1, $ProgressBar1, $Label, $Progress, $Progress1, $gamVal, $CheckKeepAlpha, $v1
Local $sDrive, $sFolder, $sFileName, $sExt
Local $sIMConv = 'magick.exe', $sIMPathFull = 'C:\Program Files\ImageMagick\', $sIMPath = FileGetShortName($sIMPathFull & $sIMConv) ; path to image magick tools
Local $Exts = "tga|jpg|bmp|dds|png|tif|jpeg", $sPattern = "\.(?i:" & $Exts & ")", $ExtsPreview = " tga | jpg | bmp | dds | png | tif | jpeg "  ; supported input file extensions
Local $ExtOutput = "png"

If $CmdLine[0] <> 0 Then
	If FileExists($sIMPath) Then
		ProcessFiles()
	Else
		MsgBox(0, $sIMConv & " not found", "File [" & $sIMPathFull & $sIMConv & "] not found" & @CRLF)
		ConsoleWrite("Download Image Magick: " & $sIMConv & " to use this tool." & @CRLF)
	EndIf
Else
	MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
	ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Func ProcessFiles()
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Converting files...", 300, 185, -1, -1) ;, $WS_POPUP) ;, $WS_EX_TOOLWINDOW)
    Local $Group1 = GUICtrlCreateGroup("Set gamma", 8, 5, 284, 56)
    $gamVal = GUICtrlCreateInput("1.3", 20, 28, 260, 22)
    $CheckKeepAlpha = GUICtrlCreateCheckbox("Keep alpha channel", 20, 68, 200, 17)
    $Label = GUICtrlCreateLabel("", 20, 94, 220, 20, $SS_LEFT) ;, $WS_EX_TOPMOST)
    $Progress1 = CreateProgress(20, 115, 260, 20)
    Local $Button1 = GUICtrlCreateButton("Start", 206, 150, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $Button1
                For $i = 1 To $CmdLine[0]
                    $sSourceFile = $CmdLine[$i]
                    _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)

                    If FileExists($sSourceFile) Then
                        If StringRegExp($sExt, "\A" & $sPattern & "\z", 0) = 1 Then
                            Settings() ; function of settings
                            ConsoleWrite("Full converting path: " & $sRunWait & @LF)
                            RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
                        Else
                            MsgBox(0, "Incorrect extension", "Extension of file [" & $sFileName & "] is [" & $sExt & "] and not in [" & $Exts & "]" & @CRLF)
                            ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
                        EndIf
                    Else
                        ConsoleWriteError("File [" & $sSourceFile & "] not found" & @CRLF)
                    EndIf

                    UpdateProgress($Progress1, ($i / $CmdLine[0]) * 100)
                    GUICtrlSetData($Label, $sFileName & $sExt)
                    ;Sleep(650)
                Next

                GUICtrlSetData($Label, "Converting complete")
                ExitLoop
        EndSwitch
    WEnd

    Sleep(1000)
EndFunc

Func Settings()
	If _IsChecked($CheckKeepAlpha) Then
		$v1 = ' '
	Else
		$v1 = ' ' & '-alpha off' & ' '
	EndIf

	$sSourceFile = '"' & $sSourceFile & '"'
	$sParams = '-gamma' & ' ' & GUICtrlRead($gamVal) & ',' & GUICtrlRead($gamVal) & ',' & GUICtrlRead($gamVal) & $v1 & '-colorspace sRGB'
	$sNewFileName = ($sFileName & '.' & $ExtOutput)
	$sDestFile = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sNewFileName & '"'

	$sRunWait = $sIMPath & " " & $sSourceFile & " " & $sParams & " " & $sDestFile
EndFunc   ;==>Settings

;---------------------------------------------------------------
;- Enhanced Progress widget
;---------------------------------------------------------------
Func CreateProgress($x, $y, $w, $h, $Label="")
	Dim $Progress[2]
	$Progress[0] = GuiCtrlCreateProgress($x, $y, $w, $h) ; this is progress bar
	$Progress[1] = GuiCtrlCreateLabel($Label, $x+0, $y-21, '', '', $SS_RIGHT) ; this is percentage label
	GUICtrlSetFont($Progress[1], 11, 500, 0, "")
	GUICtrlSetBkColor($Progress[1], $GUI_BKCOLOR_TRANSPARENT)
	Return $Progress
EndFunc

Func UpdateProgress($ProgressID, $Percent, $Label="")
	GUICtrlSetData($ProgressID[0], $Percent)
	GUICtrlSetData($ProgressID[1], $Label & Round($Percent, 1) & "%")
EndFunc

Func _IsChecked($idControlID)
	Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func Terminate()
	Exit
EndFunc   ;==>Terminate

Exit(0)


возможно процесс начался, просто прогресс-бар этого не отображает
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
возможно процесс начался, просто прогресс-бар этого не отображает
Конечно, именно так! Поэтому я и спросил:
[?]
откуда уверенность что скрипт подвисает?

Код:
UpdateProgress($Progress1, ($i / $CmdLine[0]) * 100)
GUICtrlSetData($Label, $sFileName & $sExt)

нужно переместить в начало цикла.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
конечно же! всё отлично сработало! спасибо
 
Верх