[..] Récup. d'infos entre deux fonctions lancées à part

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
GhostLine
Niveau 7
Niveau 7
Messages : 342
Enregistré le : jeu. 12 mars 2009 15:28
Localisation : Paris
Status : Hors ligne

[..] Récup. d'infos entre deux fonctions lancées à part

#1

Message par GhostLine »

Bonjour à tous ! Ça faisait une paye :)

Encore une fois, je reviens après avoir changé de boulot :p

Mon problème du jour est le suivant : je suis en train de développer un outil de synchronisation de gros fichiers à distance, et j'aimerai pouvoir lancer plusieurs copies en simultanée. J'ai trouvé une méthode qui marche ici : https://www.autoitscript.com/forum/topi ... taneously/.

Le truc est que j'ai décidé d'utiliser _LargeFileCopy, qui outre le fait d'éviter de "freezer" l'interface lors de l'exécution d'une copie, permet de faire un contrôle intégré de la copie, et, cerise sur le gâteau, d'intégrer un script récupérant toutes les informations nécessaires (entre autres) à faire fonctionner une ProgressBar ...

Du coup, je suis bien embêté : ma ProgressBar est dans mon programme principal, et je ne sais pas comment récupérer l'information de mon programme "enfant".

Ci joint les codes, pour explication.

main.au3

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>

GUICreate("File Copy Test", 250, 150)
GUICtrlCreateLabel("Try to interact with the GUI during file copy...", 20, 15)
Global $go = GUICtrlCreateButton("Copy Large File", 50, 50, 150, 50)
Global $Progress1 = GUICtrlCreateProgress(5, 125, 240, 20)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $go
			$PID = Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptDir & '\DemoLoadValues.au3' & '"')
	EndSwitch
WEnd

demoloadvalue.au3

Code : Tout sélectionner

#include <_LargeFileCopy.au3>

Local $msg, $timer, $ret
Local $src = "E:\GHO & ISO & VM\ISO\en_windows_7_professional_n_with_sp1_x64_dvd_u_677207.iso" ; <---- path to a really large file goes here, recommended 600MB+
Local $destpath = @DesktopDir & "\testdir" ; <---- destination path goes here

Do
	; create destination path
	DirCreate($destpath)
	$timer = TimerInit()
	$ret = _LargeFileCopy($src, $destpath, BitOR(1, 16), 2097152, $CALG_SHA1, "Test")
	ConsoleWrite("return: " & $ret & @CRLF & "error: " & @error & @CRLF & "time: " & TimerDiff($timer) & " ms" & @CRLF)
	If @error = 0 Then
		$resultat = "ok"
	Else
		$resultat = "ko"
	EndIf
	Sleep(1000)
	ConsoleWrite("return: " & $ret & @CRLF & "error: " & @error & @CRLF & "time: " & TimerDiff($timer) & " ms" & @CRLF)
	ConsoleWrite("====================" & @CRLF)
Until $msg = -3

Func Test($1, $2, $3)
	$3 = $3
	If $1 * 100 / $2 <> 100  Then
		$value = $1 * 100 / $2
		Return $value
		GUICtrlSetData($Progress1, $value)
	EndIf
EndFunc   ;==>Test
La valeur que je cherche à faire "transiter" de demoloadvalues à Main est $value (cf la fonction Test($1,$2,$3)).

Merci d'avance pour le coup de main !
Avatar du membre
GhostLine
Niveau 7
Niveau 7
Messages : 342
Enregistré le : jeu. 12 mars 2009 15:28
Localisation : Paris
Status : Hors ligne

Re: [..] Récup. d'infos entre deux fonctions lancées à part

#2

Message par GhostLine »

J'ai regardé du coté de MailSlot.udf et de Container.udf , sans réussir à les faire fonctionner.

J'arrive à utiliser un fichier intermédiaire, mais je retombe sur mon problème de départ : pour rafraîchir la ProgressBar, je bloque le programme dans une boucle ...

:'(
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: [..] Récup. d'infos entre deux fonctions lancées à part

#3

Message par TomAijerrie »

J'ai trois solutions à proposer :
- (ça ralenti la copie du fichier) écrire régulièrement dans un fichier ou dans le registre la valeur (programme enfant), et la lire régulièrement (programme parent).
- écrire dans un contrôle caché (coordonnées négatives de la gui, un edit ou un input par exemple), et utiliser GuiCtrlRead pour le programme parent.
- créer une fenêtre caché (@ws_hide), changer le nom de la fenêtre, en gardant les premiers caractères (blabla - 25%, pour continuer à chercher la fenêtre à partir de son nom), ou en modifiant l'une de ses coordonnées (la coordonnée en x serait la valeur (entière) de la variable value. (la position en y peux servir à envoyer un autre message : copie annulée...)

conseils :
à priori, ta progress bar se remplie lentement, utilise GuiCtrlSetLimit avec comme bornnes 0 et le nombre d'octets dans le fichier, ça évitera de n'avoir que 101 positions pour ta barre de progression (même si ce n'est que de 1 pixel, on aime la voir avancer). De plus, tu n'as plus besoin de calculer ..*100/.., et tu n'utilise que des nombres entiers pour $value (plus simple à transférer)

Tu peux utiliser AdlibRegister pour écrire et lire régulièrement, sans te casser la tete avec les sleep(..)
Avatar du membre
GhostLine
Niveau 7
Niveau 7
Messages : 342
Enregistré le : jeu. 12 mars 2009 15:28
Localisation : Paris
Status : Hors ligne

Re: [..] Récup. d'infos entre deux fonctions lancées à part

#4

Message par GhostLine »

A vrai dire, j'ai un peu honte, mais je ne sais pas comment interroger un champ dans une autre interface que l'interface parent :(
Avatar du membre
GhostLine
Niveau 7
Niveau 7
Messages : 342
Enregistré le : jeu. 12 mars 2009 15:28
Localisation : Paris
Status : Hors ligne

Re: [..] Récup. d'infos entre deux fonctions lancées à part

#5

Message par GhostLine »

... et GuiCtrlSetLimit ne fonctionne manifestement pas avec les ProgressBar ( https://www.autoitscript.com/forum/topi ... 100-limit/ ) :)
Avatar du membre
GhostLine
Niveau 7
Niveau 7
Messages : 342
Enregistré le : jeu. 12 mars 2009 15:28
Localisation : Paris
Status : Hors ligne

Re: [..] Récup. d'infos entre deux fonctions lancées à part

#6

Message par GhostLine »

Finalement, j'ai utilisé un fichier INI qui contient les valeurs en intermédiaire : je suis néanmoins intéressé par une méthode un peu plus élégante :)
Répondre