Collecte d'un Bitmap et affichage, Optimisation ?

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
ADomani
Niveau 1
Niveau 1
Messages : 13
Enregistré le : dim. 09 mai 2021 05:57
Status : Hors ligne

Collecte d'un Bitmap et affichage, Optimisation ?

#1

Message par ADomani »

Bonjour,

J'ai besoin de récupérer, en boucle, un Bitmap JPEG (light: 80k) sur mon réseau local pour l'afficher dans la GUI.
Ca fonctionne !

Par contre je trouve, après des mesures de timing que la Fonction "intRead" est relativement lente (!)
Avec 'InetGet' ca met 2 fois moins de temps, par contre je le perd avec l'enregistrement du fichier, et l'affichage :twisted:

J'ai fait des tests avec d'autre langages que je maitrise mieux que AutoIt, et c'est largement plus rapide (8 fois + rapide parfois)

Je pinaille, mais y a t'il un moyen de faire plus rapide en Utilisant Les Fonctions TCP ou autres ? ou des UDF de bas niveau.

'InetRead' doit refaire toute la séquence de connexion TCP + Authentification à chaque requêtes, ce qui doit lui faire pardre pas mal de temps (?)

Voici mon bout de code actuel:

Code : Tout sélectionner

#include <GDIPlus.au3>

HotKeySet('{ESC}', 'Exit1')
Func Exit1()
	Exit
EndFunc

Global Const $UrlBitmap = "http://user:password@192.168.0.102/path/auto.jpg"
Global Const $iTimeInterval = 300				; Interval entre chaque refresh
Global Const $iWidth = 1280, $iHeight = 720

Global $iTimes = 0
Global $hTimer = TimerInit()

Global $hGUI = GUICreate("", $iWidth, $iHeight)
Global $iPic = GUICtrlCreatePic("", 0, 0, $iWidth /2, $iHeight/2)
GUISetState(@SW_SHOW)

_GDIPlus_Startup()
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)

Do
	If $hTimer And TimerDiff($hTimer) > $iTimes * $iTimeInterval Then
		$iTimes += 1

		; plus rapide par autre technique ? inetRead Prend entre 400 & 600ms (!)
		Local $hBitmap = _GDIPlus_BitmapCreateFromMemory( InetRead( $UrlBitmap, 1+16 ) )
		Local $hBitmap_Scaled = _GDIPlus_ImageResize($hBitmap, $iWidth / 2, $iHeight / 2)
		_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, 0, 0)

	EndIf
Until GUIGetMsg() = -3

_GDIPlus_Shutdown()
GUIDelete($hGUI)

Merci pour vos conseils !
AD

EDIT: J'ai testé avec la Lib UDF "winhttp.au3", je divise par 2 les Timings par rapport a "InetRead" c'est deja ca :D
J'ai juste remplacé "InetRead()" par une "_WinHttpSimpleRequest()" dans la boucle, les _WinHttpOpen()/_WinHttpConnect() etant eux hors de la boucle...

Peut faire mieux ? :oops:
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 919
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Collecte d'un Bitmap et affichage, Optimisation ?

#2

Message par walkson »

Bonjour,
Il est bizarre votre code !
Pourquoi GUICtrlCreatePic() que vous n'utilisez pas ?
Pourquoi Local $hBitmap = _GDIPlus_BitmapCreateFromMemory( InetRead( $UrlBitmap, 1+16 ) ) dans une boucle sauf si l'image change ?
Enfin quand vous chargez un bitmap ou un graphic, vous devez libérer la mémoire avant de quitter le code, ex: _GDIPlus_GraphicsDispose($hGraphic)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Répondre