Gambas France BETA


Pas de compte ? Incription

fréquence du timer

Ce sujet est résolu.

1
AuteurMessages
stracoma#1 Posté le 29/8/2015 à 20:22:49
Apprentissage programmation pour le plaisirBonjour.
Je vous sollicite car j'ai un problème avec le timer.
Mon programme nécessite une fenêtre, un panel et 2 timers. Voilà mon 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
' Gambas class file

STATIC x AS INTEGER = 0
' A l'ouverture de la fenêtre

PUBLIC SUB Form_Open()

Timer1.Enabled = TRUE
Timer1.Delay = 1
Timer2.Delay = 1

WITH ME
.Width = 560
.Height = 560
.top = 100
.Left = 100
.Show
END WITH

WITH Panel1
.Background = Color.Red
.Width = 0
.Height = 0
.top = ME.Height / 2
.Left = ME.Height / 2

END WITH

END
' ce qui se passe quand le timer1 est en marche

PUBLIC SUB Timer1_Timer()

WITH Panel1
.Width = Panel1.Width + 2
.Height = Panel1.Height + 2
.top = Panel1.top - 1
.Left = Panel1.Left - 1

END WITH
IF Panel1.Height = ME.Height THEN
Timer1.Enabled = FALSE
Timer2.Enabled = TRUE
ENDIF

END
' ce qui se passe quand le timer2 est en marche

PUBLIC SUB Timer2_Timer()

WITH Panel1
.Width = Panel1.Width - 2
.Height = Panel1.Height - 2
.top = Panel1.top + 1
.Left = Panel1.Left + 1

END WITH
IF Panel1.Height = 0
x = x + 1
Timer2.Enabled = FALSE
Timer1.Enabled = TRUE
ENDIF
' Changement de couleur du panel

SELECT CASE x
CASE 1
Panel1.Background = Color.Orange
CASE 2
Panel1.Background = Color.Blue
CASE 3
Panel1.Background = Color.Cyan
CASE 4
Timer1.Enabled = FALSE

END SELECT
END

Pour voir grandir vite mon panel: Timer.Delay = 1 . C'est la plus grande fréquence que j'ai trouvée. Quand je veux faire plus, je donne la valeur 0.5 au Timer.Delay, là, le panel augmente moins vite! je ne comprends pas.
Merci
SVP patience avec moi car neurones > 50 ans
Foromus#2 Posté le 29/8/2015 à 22:24:38
Bonsoir,

A tout hasard, j'ai cru remarquer que, en dessous de delay= 10, ça fait n'importe quoi...
Au passage, j'ai aussi remarqué que, lorsque le système est un peu sollicité, par exemple, en affichant une barre de progression, l'affichage se bloque, et la barre n'avance plus, bien que le processus se poursuit en interne. J'ai mis ça sur le compte du logiciel interprété (plutôt que compilé - hélas pas encore possible), mais je ne sais si le lien est adéquat. Je suppose que pour les timers, le raisonnement est le même, c'est pourquoi je rajoute ce complément qui est hors sujet en fait.
Mais j'aimerais bien un avis plus éclairé !...
vuott#3 Posté le 29/8/2015 à 23:53:15
Ne cedere ineluctabili possimus
...Timer.Delay = 1 . C'est la plus grande fréquence que j'ai trouvée. Quand je veux faire plus, je donne la valeur 0.5 au Timer.Delay, là, le panel augmente moins vite! je ne comprends pas.


Bonsoir stracoma,

1 = milliseconds

Il est la plus petite valeur possible !
« Vita non suavis esse potest, nec Mors amara. »
stracoma#4 Posté le 30/8/2015 à 00:13:06
Apprentissage programmation pour le plaisir

1 = milliseconds

Il est la plus petite valeur possible !

donc pour remédier au problème:
1
2
3
4
5
6
7
WITH Panel1
.Width = Panel1.Width + 4
.Height = Panel1.Height + 4
.top = Panel1.top - 2
.Left = Panel1.Left - 2

END WITH
SVP patience avec moi car neurones > 50 ans
vuott#5 Posté le 30/8/2015 à 03:34:45
Ne cedere ineluctabili possimusBonsoir stracoma,

you could increase the speed a little by using Wait function together with the C external function usleep( ) :affraid: , that suspends execution for microsecond intervals, and by replacing Timer objects with a While...Wend cycle.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
' int usleep(useconds_t usec)
' Suspends execution for microsecond intervals.
PRIVATE EXTERN usleep(usec AS INTEGER) AS INTEGER IN "libc:6"


' A l'ouverture de la fenêtre
PRIVATE x AS BYTE
PRIVATE v AS BOOLEAN


PUBLIC SUB Form_Open()

WITH ME
.Width = 560
.Height = 560
.top = 100
.Left = 100
.Show
END WITH

WITH Panel1
.Background = Color.Red
.Width = 0
.Height = 0
.top = ME.Height / 2
.Left = ME.Height / 2
END WITH

WHILE x < 4

IF v = FALSE THEN
Expandit()
ELSE
Contrahit()
ENDIF

usleep(100) ' Set 100 microseconds (100 millionth of a seconds) = μs 100
WAIT

WEND

END


PUBLIC SUB Expandit()

WITH Panel1
.Width = Panel1.Width + 2
.Height = Panel1.Height + 2
.top = Panel1.top - 1
.Left = Panel1.Left - 1
END WITH

IF Panel1.Height = ME.Height THEN v = TRUE

END


PUBLIC SUB Contrahit()

WITH Panel1
.Width = Panel1.Width - 2
.Height = Panel1.Height - 2
.top = Panel1.top + 1
.Left = Panel1.Left + 1
END WITH

IF Panel1.Height = 0
INC x
v = FALSE
ENDIF

' Changement de couleur du panel

SELECT CASE x
CASE 1
Panel1.Background = Color.Orange
CASE 2
Panel1.Background = Color.Blue
CASE 3
Panel1.Background = Color.Cyan
END SELECT

END
« Vita non suavis esse potest, nec Mors amara. »
stracoma#6 Posté le 30/8/2015 à 13:32:54
Apprentissage programmation pour le plaisirMerci vuot.
je suis nul en anglais mais j'ai compris. j'ai donc refais le 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
' Gambas class file

PUBLIC SUB Form_Open()
DIM x AS BYTE

WITH ME
.Show
.top = 100
.left = 100
.Width = 600
.Height = 600
END WITH

WITH Panel1
.Width = 0
.Height = 0
.top = 300
.Left = 300
END WITH
FOR x = 1 TO 4

SELECT CASE x
CASE 1
Panel1.Background = Color.Red
CASE 2
Panel1.Background = Color.Orange
CASE 3
Panel1.Background = Color.Blue
CASE 4
Panel1.Background = Color.Cyan
END SELECT

DO WHILE Panel1.Width < ME.Width
expansion()
WAIT 0.0002
LOOP

DO WHILE Panel1.Width > 0
retraction()
WAIT 0.0002
LOOP
NEXT

END


PUBLIC SUB expansion()
WITH Panel1
.Width = Panel1.Width + 2
.Height = Panel1.Height + 2
.top = Panel1.top - 1
.Left = Panel1.Left - 1
END WITH
END

PUBLIC SUB retraction()
WITH Panel1
.Width = Panel1.Width - 2
.Height = Panel1.Height - 2
.top = Panel1.top + 1
.Left = Panel1.Left + 1
END WITH

END
SVP patience avec moi car neurones > 50 ans
vuott#7 Posté le 30/8/2015 à 14:06:46
Ne cedere ineluctabili possimus
j'ai donc refais le code


Bonjour stracoma,

( Attention, je tente :bball: avec un traducteur en ligne: italiano -> français )

No, vous ne pouvez pas écrire Wait 0.0002, parce que dans Gambas la valeur minimale (la plus petite disponible) est de 1 milliseconde, c'est-à-dire Wait 0.001

Si tu écris Wait 0.0002, il est comme écrire Wait sans numéros.
...fais le test. ;)
« Vita non suavis esse potest, nec Mors amara. »
stracoma#8 Posté le 30/8/2015 à 15:33:47
Apprentissage programmation pour le plaisir


No, vous ne pouvez pas écrire Wait 0.0002, parce que dans Gambas la valeur minimale (la plus petite disponible) est de 1 milliseconde, c'est-à-dire Wait 0.001

Si tu écris Wait 0.0002, il est comme écrire Wait sans numéros.
...fais le test. ;)


j'ai refais le test avec un compteur en ms:
pas de différence entre 0.001 et 0.0005. par contre il va plus vite avec0.0002, encore plus avec 0.0001 et encore plus avec Wait sans valeur

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
' Gambas class file

PUBLIC SUB Form_Open()

DIM x AS BYTE
Timer1.Enabled = TRUE
ValueBox1.Top = 650
ValueBox1.Left = 10

WITH ME
.Show
.top = 100
.left = 100
.Width = 600
.Height = 700
END WITH

WITH Panel1
.Width = 0
.Height = 0
.top = 300
.Left = 300
END WITH


FOR x = 1 TO 4

SELECT CASE x
CASE 1
Panel1.Background = Color.Red
CASE 2
Panel1.Background = Color.Orange
CASE 3
Panel1.Background = Color.Blue
CASE 4
Panel1.Background = Color.Cyan
END SELECT

DO WHILE Panel1.Width < ME.Width

expansion()
WAIT 0.0001
LOOP

DO WHILE Panel1.Width > 0

retraction()
WAIT 0.0001

LOOP
NEXT
Timer1.Enabled = FALSE
END


PUBLIC SUB expansion()
WITH Panel1
.Width = Panel1.Width + 2
.Height = Panel1.Height + 2
.top = Panel1.top - 1
.Left = Panel1.Left - 1
END WITH
END

PUBLIC SUB retraction()
WITH Panel1
.Width = Panel1.Width - 2
.Height = Panel1.Height - 2
.top = Panel1.top + 1
.Left = Panel1.Left + 1
END WITH

END



PUBLIC SUB Timer1_Timer()
Timer1.Delay = 1
ValueBox1.Value = ValueBox1.Value + 1

END
SVP patience avec moi car neurones > 50 ans
vuott#9 Posté le 30/8/2015 à 15:58:13
Ne cedere ineluctabili possimus
... il va plus vite avec0.0002, encore plus avec 0.0001 et encore plus avec Wait sans valeur

Je ne vois pas différences entre Wait solitaire et Wait avec des valeurs inférieures à 0.0005

À propos de l'égalité de vitesse entre Wait 0.001 et valeurs supérieures à Wait 0.0004, ces valeurs viennent arrondies probablement au supérieur décimal: c'est-à-dire 0.001
« Vita non suavis esse potest, nec Mors amara. »
stracoma#10 Posté le 30/8/2015 à 16:26:50
Apprentissage programmation pour le plaisir

Je ne vois pas différences entre Wait solitaire et Wait avec des valeurs inférieures à 0.0005

pourtant le chrono que j'ai mis dans le ValueBox le prouve
SVP patience avec moi car neurones > 50 ans
vuott#11 Posté le 30/8/2015 à 17:59:34
Ne cedere ineluctabili possimus
ValueBox le prouve

uhmmm.... je l'ai fait ce test: Je essayé votre code:

10 fois avec la valeur 0,0004. Les résultats ont été les suivants:
238 - 777 - 227 - 731 - 193 - 233 - 336 - 793 - 242 - 743
la moyenne était de: 451,3

10 fois avec une valeur 0,0001
271 - 771 - 180 - 222 - 331 - 838 - 585 - 197 - 137 - 788
la moyenne était de: 432,0

:?:

10 fois avec "Wait" solitaire:
345 - 745 - 260 - 225 - 257 - 181 - 109 - 197 - 225 - 139
la moyenne était de: 268,3

Probablement le code avec le attente solitaire est plus rapide, car il n'a pas à tenir compte des valeurs (même si elles sont sous-milliseconde)


Mon Système d'exploitation:
[System]
Gambas=3.8.90 r7256
OperatingSystem=Linux
Kernel=3.13.0-24-generic
Architecture=x86_64
Distribution=Linux Mint 17.1 Rebecca
Desktop=GNOME
Memory=3953M
« Vita non suavis esse potest, nec Mors amara. »
stracoma#12 Posté le 30/8/2015 à 18:16:54
Apprentissage programmation pour le plaisirdiscussion fructueuse ;)
SVP patience avec moi car neurones > 50 ans
vuott#13 Posté le 30/8/2015 à 19:24:55
Ne cedere ineluctabili possimus
discussion fructueuse ;)


:)

Sic est !


Bon, parce que la valeur minimum temporal est 1 milliseconde (ms 1) qu'il peut être assigné en Gambas, mon opinion est que nous avons deux seuils: Wait 0.001 et Wait solitaire.
Je crois que nous pouvons contrôler la vitesse d'une manière plus adéquate entre ces deux seuils avec la fonction extérieur de C: usleep() .

Toutefois, la nécessité de mettre Wait solitaire avec la fonction externe de C usleep(), - à mon humble avis - est une limite de Gambas. :pale:

Bah ! De toute façon...
« Vita non suavis esse potest, nec Mors amara. »
stracoma#14 Posté le 30/8/2015 à 21:18:11
Apprentissage programmation pour le plaisirje dois aller voir la doc sur C: usleep() (jamais vu)
SVP patience avec moi car neurones > 50 ans
1