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. PhilippeSystè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 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.
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 |