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 ~ Version Gambas : 3.19.5 |
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 ~ Version Gambas : 3.19.5 |
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. PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
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
|
« Vita non suavis esse potest, nec Mors amara. » |
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 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
|
« Vita non suavis esse potest, nec Mors amara. » |
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.
Si tu essayes mon code, tu verras que ça marche pour chaque niveau.« Vita non suavis esse potest, nec Mors amara. » |
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
|
« Vita non suavis esse potest, nec Mors amara. » |
spheris | #11 Posté le 11/1/2022 à 10:29:49 |
---|
| Vuott excuse moi, après essais, ce code fonctionne correctement. Merci pour ton aide |