Что нового

Временной лаг, при зацикливании операции

perven1

Новичок
Сообщения
57
Репутация
0
Добрый день, специалисты autoit.
Помогите разобраться.

Есть скрипт, быстро меняющий картинки выводимые на экран - зацикливая эту операцию.
Однако заметно, что при обычной смене картинок - временной промежуток один, а при заходе цикла - на повтор - временной промежуток - другой, несколько больший.
Таким образом при зацикливании операции происходит временной лаг, который хорошо виден при работе скрипта (визуально - происходит небольшой рывок).

Подскажите как выровнять временные интервалы - для обычной смены картинок и для момента захода на новый цикл ?
(Чтобы визуально - не было заметно рывка в конце цикла.)
Код:
#include <File.au3>
#include <Array.au3>
#include <GDIPlus.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("_OnExit")

$sPNGsPath = @ScriptDir
$aPNGsList = _FileListToArrayRec($sPNGsPath, "*.jpg", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
If @error Then Exit MsgBox(0, "Ошибка " & @error, "Файлы не найдены")

_GDIPlus_Startup()

$hImage = _GDIPlus_ImageLoadFromFile($aPNGsList[1])
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hGUI = GUICreate("", _GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage), -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
_WinAPI_UpdateLayeredWindowEx($hGUI, -1, -1, $hBitmap, 255, 1)
GUISetState()
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImage)

$hTimer = TimerInit()
If $aPNGsList[0] > 1 Then
    $iCounter = 2
Else
    $iCounter = 1
EndIf

Do
    If TimerDiff($hTimer) >= 100 Then
        $hImage = _GDIPlus_ImageLoadFromFile($aPNGsList[$iCounter])
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $iWidth = _GDIPlus_ImageGetWidth($hImage)
        $iHeight = _GDIPlus_ImageGetHeight($hImage)
        _WinAPI_UpdateLayeredWindowEx($hGUI, -1, -1, $hBitmap, 255, 1)
        ;Для центрирования окна при любом размере изображения
        ;$iWidth = _GDIPlus_ImageGetWidth($hImage)
        ;$iHeight = _GDIPlus_ImageGetHeight($hImage)
        ;_WinAPI_UpdateLayeredWindowEx($hGUI, @DesktopWidth / 2 - $iWidth / 2, @DesktopHeight / 2 - $iHeight / 2, $hBitmap, 255, 1)
        _WinAPI_DeleteObject($hBitmap)
        _GDIPlus_ImageDispose($hImage)
        $iCounter += 1
        If $iCounter > $aPNGsList[0] Then $iCounter = 1
        $hTimer = TimerInit()
    EndIf
Until GUIGetMsg() = -3

Func _OnExit()
    _GDIPlus_Shutdown()
EndFunc
 

Вложения

  • 1.rar
    75.4 КБ · Просмотры: 2

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
perven1 сказал(а):
(визуально - происходит небольшой рывок).

Посмотрите как _FileListToArrayRec (добавил _ArrayDisplay) сортирует файлы. Решить проблему можно пронумеровав файлы 01, 02, 03 и т.д.

Код:
#include <File.au3>
#include <Array.au3>
#include <GDIPlus.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("_OnExit")

$sPNGsPath = @ScriptDir
$aPNGsList = _FileListToArrayRec($sPNGsPath, "*.jpg", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
If @error Then Exit MsgBox(0, "Ошибка " & @error, "Файлы не найдены")
_ArrayDisplay($aPNGsList)
_GDIPlus_Startup()

$hImage = _GDIPlus_ImageLoadFromFile($aPNGsList[1])
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hGUI = GUICreate("", _GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage), -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
_WinAPI_UpdateLayeredWindowEx($hGUI, -1, -1, $hBitmap, 255, 1)
GUISetState()
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImage)

$hTimer = TimerInit()
If $aPNGsList[0] > 1 Then
    $iCounter = 2
Else
    $iCounter = 1
EndIf

Do
    If TimerDiff($hTimer) >= 100 Then
        $hImage = _GDIPlus_ImageLoadFromFile($aPNGsList[$iCounter])
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $iWidth = _GDIPlus_ImageGetWidth($hImage)
        $iHeight = _GDIPlus_ImageGetHeight($hImage)
        _WinAPI_UpdateLayeredWindowEx($hGUI, -1, -1, $hBitmap, 255, 1)
        ;Для центрирования окна при любом размере изображения
        ;$iWidth = _GDIPlus_ImageGetWidth($hImage)
        ;$iHeight = _GDIPlus_ImageGetHeight($hImage)
        ;_WinAPI_UpdateLayeredWindowEx($hGUI, @DesktopWidth / 2 - $iWidth / 2, @DesktopHeight / 2 - $iHeight / 2, $hBitmap, 255, 1)
        _WinAPI_DeleteObject($hBitmap)
        _GDIPlus_ImageDispose($hImage)
        $iCounter += 1
        If $iCounter > $aPNGsList[0] Then $iCounter = 1
        $hTimer = TimerInit()
    EndIf
Until GUIGetMsg() = -3

Func _OnExit()
    _GDIPlus_Shutdown()
EndFunc
 
Верх