Skif_off
|
Posted: Tue Sep 30, 2014 15:11 Post subject: |
|
|
В качестве слабого компа выступал HP Pavilion dm1-4000er (только на аккумуляторе - сбалансированный/энергосберегающий режим + Avast)
- Снижена нагрузка на процессор со стороны AutoIt.exe - не более 2-4% максимум).
- Процесс jpegtran.exe считается зависшим спустя 30 секунд (подобрано подсчетом времени оптимизации больших файлов - пачки 50ти метровых JPEG (на одном из файлов (10843x6920) jpegtran.exe отожрал ~540 Мб ОЗУ, 200 Мб и 21672x13820 не прожевал, имейте в виду (в логе будет Insufficient memory (case 4))) после запуска и принудительно завершается с записью в лог.
- Возможно увеличение времени работы на большом количестве мелких (типа 20-200 кб) файлов, хотя на большом количестве типичных фоток с мыльницы, наоборот, наблюдал уменьшение времени на ~13%.
 Скрипт: Code: |
#NoTrayIcon
#include <FileOperations.au3>
;Автор идеи Tol!k, батник: http://forum.wincmd.ru/viewtopic.php?p=56916#56916
Opt('WinWaitDelay', 100)
Global Const $tagPOINT = 'struct;long X;long Y;endstruct'
Global Const $HGDI_ERROR = Ptr(-1)
Global Const $INVALID_HANDLE_VALUE = Ptr(-1)
Global Const $KF_EXTENDED = 0x0100
Global Const $KF_ALTDOWN = 0x2000
Global Const $KF_UP = 0x8000
Global Const $LLKHF_EXTENDED = BitShift($KF_EXTENDED, 8)
Global Const $LLKHF_ALTDOWN = BitShift($KF_ALTDOWN, 8)
Global Const $LLKHF_UP = BitShift($KF_UP, 8)
;Обозвал локальными, т.к. скомпилированная версия иногда ругается
Local $sPathWithPic, $iD, $aFileList, $hFile, $recurs
#Region ;Обрабатываем командную строку, если пустая - появится окно выбора каталога
If $CmdLine[0] = 0 Then
While 1
$sPathWithPic = FileSelectFolder('Укажите каталог с изображениями', '', 4)
If @error And $sPathWithPic = '' Then Exit
If @error Or Not StringInStr(FileGetAttrib($sPathWithPic), "D") Then
MsgBox(4096, 'JPGtest.au3', 'Вы указали "' & $sPathWithPic & '", а не каталог')
Else
ExitLoop
EndIf
WEnd
Switch MsgBox(3 + 4096, 'JPGtest.au3', 'Проверить изображения только в этом каталоге? ' & _
'Иначе - рекурсивно. Кнопка Отмена завершит работу скрипта.')
Case 6
$iD = 0
Case 7
$iD = 125
Case 2
Exit
EndSwitch
ElseIf $CmdLine[0] = 1 Then
$sPathWithPic = $CmdLine[1]
$iD = 0
ElseIf $CmdLine[0] = 2 And $CmdLine[2] = 'recurs' Then
$sPathWithPic = $CmdLine[1]
$iD = 125
EndIf
#EndRegion
;Получаем массив со всеми файлами (или не получаем :))
$aFileList = _FO_FileSearch($sPathWithPic, 'jpg|jpeg|jpe', True, $iD, 1, 1, 2, 0)
If @error Then
Switch @error
Case 1
MsgBox(4096, 'JPGtest.au3', 'Неверный путь!')
Exit
Case 2
MsgBox(4096, 'JPGtest.au3', 'Неверная маска!')
Exit
Case 3
MsgBox(4096, 'JPGtest.au3', 'Ничего не найдено!')
Exit
EndSwitch
EndIf
#Region ;Процесс пошел
;Удаляем старый лог и testtmp.jpg, если есть
If FileExists(@TempDir & '\jpgerror.txt') Then
FileSetAttrib(@TempDir & '\jpgerror.txt', '-RASHNOT')
FileDelete(@TempDir & '\jpgerror.txt')
EndIf
If FileExists(@TempDir & '\testtmp.jpg') Then
FileSetAttrib(@TempDir & '\testtmp.jpg', '-RASHNOT')
FileDelete(@TempDir & '\testtmp.jpg')
EndIf
;Создаем в %Temp% лог для поврежденных файлов (в UTF8 with BOM)
$hFile = FileOpen(@TempDir & '\jpgerror.txt', 1 + 128)
;Проверяем
If $hFile = -1 Then
MsgBox(4096, 'JPGtest.au3 - Ошибка!', 'Невозможно открыть файл для записи лога.')
Exit
EndIf
;Счетчик ошибок
$iCounterError = 0
$iHangsrError = 0
GUICreate('JPGtest.au3', 350, 150)
$FullFileName = GUICtrlCreateLabel('', 5, 5, 340, 120, 0x0000)
$StatusBar = GUICtrlCreateLabel('', 5, 128, 340, 17, 0x0000)
GUICtrlSetColor(-1, 0xff0000)
GUISetState()
For $i = 1 To $aFileList[0]
GUICtrlSetData($FullFileName, $aFileList[$i])
GUICtrlSetData($StatusBar, '*error/current/all: *' & $iCounterError & '/' & $i & '/' & $aFileList[0])
$sOut = ''
$iPID = Run(@ScriptDir & '\jpegtran.exe -optimize "' & $aFileList[$i] & '" "' & @TempDir & '\testtmp.jpg"', '', @SW_HIDE, 4)
ProcessWaitClose($iPID, 30)
If ProcessExists($iPID) Then
ProcessClose($iPID)
FileWriteLine($hFile, $aFileList[$i] & @TAB & 'процесс завис на этом файле, принудительно завершен')
$iCounterError += 1
ContinueLoop
EndIf
$sOut = StderrRead($iPID)
If $sOut Then
$sError = StringRegExpReplace($sOut, '[\r\n]+', ' ')
FileWriteLine($hFile, $aFileList[$i] & @TAB & $sError)
$iCounterError += 1
EndIf
Next
FileClose($hFile)
GUIDelete()
#EndRegion
;Дополнение для результата
If $iD = 0 Then
$recurs = ' (исключая подкаталоги) '
ElseIf $iD = 125 Then
$recurs = ' (включая подкаталоги) '
EndIf
;Результат
If $iCounterError = 0 Then
MsgBox(4096, 'JPGtest.au3', 'Скрипт завершил работу, поврежденные файлы в ' & _
'каталоге "' & $sPathWithPic & '"' & $recurs & 'не найдены.')
Else
Switch MsgBox(4 + 4096, 'JPGtest.au3', 'Скрипт завершил работу, в каталоге "' & _
$sPathWithPic & '"' & $recurs & 'найдены поврежденные файлы: ' & _
$iCounterError & '. Лог сохранен в "' & @TempDir & '", открыть?')
Case 6
ShellExecute(@TempDir & '\jpgerror.txt')
Case 7
Exit
EndSwitch
EndIf |
 Для полной самодостаточности в конец скрипта скопировать из FileOperations.au3 функции:
_FO_FileSearch
__FO_GetListMask
__FO_UserLocale
__FO_FileSearchType
__FO_FileSearchMask
__FO_FileSearchAll
__ChExcludeFolders
__FO_MaskUnique (перед функцией добавить директиву #Obfuscator_Off на случай компиляции)
З.Ы. На нормальном, достаточно современном десктопе с не самыми медленными хардами и более чем одним ядром (антивируснику же надо нагнуть систему), можно попробовать поставить Opt('WinWaitDelay', 50): выигрыш от 2% и далее на разнородных файлах (ну и на большом количестве).
Last edited by Skif_off on Tue Oct 07, 2014 10:32; edited 2 times in total |
|