Gambas France BETA


Pas de compte ? Incription

protection timer

Ce sujet est résolu.

1
AuteurMessages
valaquarus#1 Posté le 27/3/2021 à 11:38:20
-- Unus Ex Altera --Bonjour à tous,
j'expérimente un petit soucis avec un timer qui ne me renvoi pas les tic (1000 ms) comme il faut suite à l'occupation de la mémoire , je suppose par un process très gourmand. Ma question est comment allouer un peu de mémoire à mon timer ou comment le protéger du process pour que les tic soient réguliers. J'ai essayé avec un wait mais cela ne fonctionne pas.
Philippe
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
valaquarus#2 Posté le 27/3/2021 à 15:00:54
-- Unus Ex Altera --Voici ce qu'on trouve dans l'aide :
1
2
3
4
5
6
7
DIM StartTime AS FLOAT
DIM DiffTime AS FLOAT

StartTime = Timer
ME.Show
DiffTime = Timer - StartTime
PRINT DiffTime * 1000; " msec"

En modifiant légèrement la chose :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PUBLIC SUB TournProc() 'tant que tourne le process
DIM i, j AS INTEGER
DIM Depart AS FLOAT

Depart = Timer
j = CInt(FMain.txSalida2.Width / 8.75)
WHILE hProc.state = hProc.Running
FMain.dTemps = (Timer - depart) / 100000
MouseWait()
i += 1
IF i > j THEN
i = 0
FMain.txSalida2.Clear
ENDIF
FMain.txSalida3.Text = (" Trabajo en curso... ") & "[ " & Format$((FMain.dTemps), "hh:nn:ss") & " ] "
FMain.txSalida2.Text &= "#"
WAIT 1
IF hProc.State = hProc.Stopped THEN BREAK
WEND
Mousedefault()
END

Même si le process prend toute la mémoire, le décompte du temps se fait correctement grâce au timer et même si l'affichage est différé parfois.
Philippe
P.S. : Je passe en résolu sauf si quelqu'un a une plus belle idée dont je serai volontiers preneur.
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
valaquarus#3 Posté le 28/3/2021 à 13:29:04
-- Unus Ex Altera --Un petit correctif :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PUBLIC SUB TournProc() 'tant que tourne le process
DIM i, j AS INTEGER
Depart = Timer
' FMain.Timer1.Start
j = CInt(FMain.txSalida2.Width / 8.75)
WHILE hProc.state = hProc.Running
MouseWait()
'******************* A commenter si Timer ****************************
FMain.dTemps = Time(0, 0, 0, CInt(Timer - ClamScan.Depart) * 1000)
FMain.txSalida3.Text = (" Trabajo en curso... ") & "[ " & FMain.dTemps & " ] "
FMain.txSalida2.Text &= "#"
'*********************************************************************
i += 1
IF i > j THEN
i = 0
FMain.txSalida2.Clear
ENDIF
WAIT 1 'rappel du timer sinon ne marche pas
IF hProc.State = hProc.Stopped THEN BREAK
WEND
' FMain.Timer1.Stop
Mousedefault()
END

Plus joli et plus efficace.
Philippe
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
spheris#4 Posté le 9/1/2022 à 08:43:54
Bonjour,
je fais remonter ce vieux post.
Je ne comprends pas. je lance dans une boucle
1
2
FOR EACH a IN Dir("/home/user)"
NEXT

un process de copie de fichier et voudrais avoir une progressbar qui en suis l'evolution.

Je n'arrive pas à incrémenter ma progressbar en temps reel, elle affiche 0 puis a la fin de la copie des 3000 fichiers elle affiche 100%
Comme puis-je faire à ton avis?
vuott#5 Posté le 9/1/2022 à 17:31:07
Ne cedere ineluctabili possimus
1
2
FOR EACH a IN Dir("/home/user)"
NEXT

un process de copie de fichier et voudrais avoir une progressbar qui en suis l'evolution.

Je n'arrive pas à incrémenter ma progressbar en temps reel, elle affiche 0 puis a la fin de la copie des 3000 fichiers elle affiche 100%
Comme puis-je faire à ton avis?

Un code possible pourrait être ceci:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUBLIC SUB Button1_Click()

DIM chemin AS STRING = User.Home
DIM a AS STRING
DIM tot, i AS INTEGER

MKDIR "/tmp/zzzz"

tot = Dir(chemin, "*.*", gb.file).Count

FOR EACH a IN Dir(chemin, "*.*", gb.file)
COPY chemin &/ a TO "/tmp/zzzz" &/ a ' Copier chaque fichier - par exemple - dans le chemin "/tmp/zzzz"
ME.Text = chemin &/ a
INC i
ProgressBar1.Value = i / tot
WAIT 0.1
NEXT

END
spheris#6 Posté le 10/1/2022 à 14:53:53
Vuott,
merci, ta méthode fonctionne très bien.
un seul petit problème, je n'arrive pas à copier les fichiers et dossiers de manière récursive avec COPY.
Comment puis-je faire autrement en gambas plutôt qu'avec la commande ci-dessous:

1
EXEC ["cp", "-P", "-p", "-r", $source, $destination]

vuott#7 Posté le 10/1/2022 à 16:34:04
Ne cedere ineluctabili possimus
Comment puis-je faire autrement en gambas plutôt qu'avec la commande ci-dessous:

1
EXEC ["cp", "-P", "-p", "-r", $source, $destination]


Bonjour spheris,
uhmmm....je ne me souviens :pale: pas s’il y a une modalité courte, mais pour l’instant je proposerais ces lignes explicites de code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
PRIVATE CONST DOSSIER_PRINCIPAL AS STRING = "chemin/du/dossier/principal"
PRIVATE CONST DOSSIER_CLONE AS STRING = "/tmp/dossier_clone"


PUBLIC SUB Main()

DIM dr, fl AS STRING

' Créez le nouveau dossier, où d’autres sub-dossiers et fichiers seront copiés récursivement:
MKDIR DOSSIER_CLONE

' Copiez d’abord dans le "dossier clone" les fichiers contenus dans le "dossier principal":
FOR EACH fl IN Dir(DOSSIER_PRINCIPAL, "*", gb.File)
COPY DOSSIER_PRINCIPAL &/ fl TO DOSSIER_CLONE &/ fl
NEXT

' Cherchez récursivement dans le "dossier principal", dont vous devez copier le contenu:
FOR EACH dr IN RDir(DOSSIER_PRINCIPAL, "*", gb.Directory)
' Chaque sub-dossier trouvé est recréé (vide) dans le dossier-clone:
MKDIR DOSSIER_CLONE &/ dr
' Pour chaque sub-dossier trouvé, les chemins des fichiers contenus sont identifiés:
FOR EACH fl IN Dir(DOSSIER_PRINCIPAL &/ dr, "*", gb.File)
' ...qui sont copiés dans le nouveau sub-dossier du nouveau "dossier clone":
COPY DOSSIER_PRINCIPAL &/ dr &/ fl TO DOSSIER_CLONE &/ dr &/ fl
NEXT
NEXT

END
spheris#8 Posté le 10/1/2022 à 17:44:22
Merci,
Mais il y a un petit problème, ce code ne traite que de répertoires et sous répertoires au niveau 1.
Et si il y a un sous niveau 4 ou 8 ou autre?
exemple :

/home/hello/litalie/bonne/annee/2022

vuott#9 Posté le 10/1/2022 à 17:52:57
Ne cedere ineluctabili possimus
Merci,
Mais il y a un petit problème, ce code ne traite que de répertoires et sous répertoires au niveau 1.

:affraid:

Si tu essayes mon code, tu verras que ça marche pour chaque niveau.
vuott#10 Posté le 10/1/2022 à 20:01:20
Ne cedere ineluctabili possimus...et avec un code plus court:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PRIVATE CONST DOSSIER_PRINCIPAL AS STRING = "chemin/du/dossier/principal"
PRIVATE CONST DOSSIER_CLONE AS STRING = "/tmp/dossier_clone"


PUBLIC SUB Main()

DIM s AS STRING

' Créez le nouveau dossier, où d’autres sub-dossiers et fichiers seront copiés récursivement:
MKDIR DOSSIER_CLONE

FOR EACH s IN RDir(DOSSIER_PRINCIPAL, "*")
IF NOT IsDir(DOSSIER_PRINCIPAL &/ s) THEN
IF NOT Exist(DOSSIER_CLONE &/ s) THEN COPY DOSSIER_PRINCIPAL &/ s TO DOSSIER_CLONE &/ s
ELSE
MKDIR DOSSIER_CLONE &/ s
ENDIF
NEXT

END
spheris#11 Posté le 11/1/2022 à 10:29:49
Vuott
excuse moi, après essais, ce code fonctionne correctement.
Merci pour ton aide
;)
1