OVH Cloud OVH Cloud

Tps d'exécution, Timer, graphique..... Au secours...

13 réponses
Avatar
TouTi
Héo...

Cela fait trois jours que je suis sur un problème que je modèle de toute
part sans aboutir à un résultat stable.

Je résume mon projet :

* J'ai un cercle (horloge) dont le nombre de graduation peut aller de 1 à 50
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une vitesse
définie (8, 9, ... 60 s par tour) dans un sens ou dans l'autre
* J'ai cinq boutons :
- deux doivent permettre de faire un tour complet à l'aiguille dans un sens
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation dans
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle se
trouvera juste devant une graduation

Dans le timer réglé à 10ms,
* J'appelle une sub d'affichage de l'anneau et des graduations
* puis j'appelle une sub d'affichage de l'aiguille(avec calcul sin et cos et
sub "trace")
et tout cela(dans le cas le plus défavorable) pour qu'au bout de 8s
l'aiguille est fait un tour complet

J'utilise pour le traçage graphique des API pour obtenir des extrémités
plates pour les lignes d'épaisseur importante

Sub trace(XD, YD, XF, YF, col, DW)
Dim ExtendedPen&, di&
Dim Brushinfo As LOGBRUSH
Brushinfo.lbColor = col
Brushinfo.lbStyle = BS_SOLID

ExtendedPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_FLAT Or
PS_JOIN_ROUND, DW, Brushinfo, 0, ByVal 0&)
OldPen = SelectObject(pic.hdc, ExtendedPen&)
di = BeginPath(pic.hdc)
pic.Line (XD, YD)-(XF, YF)
di = EndPath(pic.hdc)
di = StrokePath(pic.hdc)
di = SelectObject(pic.hdc, OldPen)
di = DeleteObject(ExtendedPen)
End Sub

Je réalise le projet sur une machine cadencée à 1.67 GHz avec une carte
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le temps
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée : Le
temps d'exécution à un retard de deux secondes

Que pourrais-je encore faire pour aboutir au résultat conforme quelque soit
la situation???????

Un grand... mais Grand merci d'avance pour votre aide

--
Guy

10 réponses

1 2
Avatar
Jean-Marc
Hello,

tes calculs de temps sont de toute évidence faux, car un simple calcul
montre que même dans le cas le plus défavorable, l'aiguille doit
parcourir 50 graduations en 8 secondes à savoir au pire 6,25 affichages
par seconde (ce qui nous laisse exactement 160 ms pour faire un
affichage).

Or 160 millisecondes, c'est un énorme temps. Même pour une très vielle
machine avec une carte graphique préhistorique, calculer un cosinus et
un sinus et tracer un trait ne prendra au pire que quelques
millisecondes. Tu as au pire 10 à 20 fois plus de temps que nécessaire.

Et même si tu voulais encore 10 minidéplacements entre graduations,
cela ne ferait que 10 fois plus, à savoir 16 millisecondes par
affichage, ce qui est encore très gérable.

Rien de hardware ne pouvant donc expliquer le comportement que tu
décris, tes calculs d'intervalles sont donc simplement faux. Pourquoi?

Une erreur classique est de se fier au Timer pour calculer un temps
écoulé. En dessous d'une certaine valeur (plus ou moins 100 ms), les
résultats deviennent faux. Tu peux utiliser le timer comme *évènement*,
si tu n'est pas à 2 ou 3 millisecondes pour le déclenchement, mais
surement pas comme BASE de temps.

Il y a des API faites pour cela, comme par exemple GetTickCount() dont
l'emploi est recommandé pour faire ce genre de choses, lorque l'on a
besoin de précision.

Conseil: garde ton timer pour avoir un évènement, met une valeur de
l'ordre d'une 20aine de millisecondes (ca te fait en gros 10 passages
intermédiaires entre graduations dans le pire des cas, MAIS ne te fie
pas au nombre de fois ou tu passes dans le Timer comme REFERENCE de
temps (je suppose que tu fais un cumul).

Utilise au contraire une base de temps certaine (GetTickCount est faite
pour cela). Grace à cela, je peux te garantir que tu peux faire une
horloge qui fera un tour complet avec une précision de l'odre de 10
millisecondes, sur n'importe quel ordinateur, aussi vieux soit il. Si
la machine est une antiquité, genre un 386 à 40 Mhz, je peux te
garantir que ca marchera, je peux même te dire que la précision sera
dans le pire des cas de 18,6 millisecondes (les anciens savent
pourquoi...), ce qui te fait au pire une erreur moyenne entre tes 50
graduations de 18,6/50 soit 0,3 millisecondes! J'ai écrit des choses
dans
ce genre la sur des 286/20 Mhz, en QBasic, au milieu des années 80 et ça
marchait déjà trèsz bien, alors tu penses :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;

"TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
news:drtsia$a86$
Héo...

Cela fait trois jours que je suis sur un problème que je modèle de


toute
part sans aboutir à un résultat stable.

Je résume mon projet :

* J'ai un cercle (horloge) dont le nombre de graduation peut aller de


1 à 50
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une


vitesse
définie (8, 9, ... 60 s par tour) dans un sens ou dans l'autre
* J'ai cinq boutons :
- deux doivent permettre de faire un tour complet à l'aiguille dans un


sens
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation


dans
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle


se
trouvera juste devant une graduation

Dans le timer réglé à 10ms,
* J'appelle une sub d'affichage de l'anneau et des graduations
* puis j'appelle une sub d'affichage de l'aiguille(avec calcul sin et


cos et
sub "trace")
et tout cela(dans le cas le plus défavorable) pour qu'au bout de 8s
l'aiguille est fait un tour complet

J'utilise pour le traçage graphique des API pour obtenir des


extrémités
plates pour les lignes d'épaisseur importante

Sub trace(XD, YD, XF, YF, col, DW)
Dim ExtendedPen&, di&
Dim Brushinfo As LOGBRUSH
Brushinfo.lbColor = col
Brushinfo.lbStyle = BS_SOLID

ExtendedPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_FLAT Or
PS_JOIN_ROUND, DW, Brushinfo, 0, ByVal 0&)
OldPen = SelectObject(pic.hdc, ExtendedPen&)
di = BeginPath(pic.hdc)
pic.Line (XD, YD)-(XF, YF)
di = EndPath(pic.hdc)
di = StrokePath(pic.hdc)
di = SelectObject(pic.hdc, OldPen)
di = DeleteObject(ExtendedPen)
End Sub

Je réalise le projet sur une machine cadencée à 1.67 GHz avec une


carte
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le


temps
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :


Le
temps d'exécution à un retard de deux secondes

Que pourrais-je encore faire pour aboutir au résultat conforme quelque


soit
la situation???????

Un grand... mais Grand merci d'avance pour votre aide

--
Guy




Avatar
Christian Hugoud
Pas mieux : le timer ne convient pas pour ce type de traitement.


"Jean-Marc" a écrit dans le message de news:
43e28025$0$1158$
Hello,

tes calculs de temps sont de toute évidence faux, car un simple calcul
montre que même dans le cas le plus défavorable, l'aiguille doit
parcourir 50 graduations en 8 secondes à savoir au pire 6,25 affichages
par seconde (ce qui nous laisse exactement 160 ms pour faire un
affichage).

Or 160 millisecondes, c'est un énorme temps. Même pour une très vielle
machine avec une carte graphique préhistorique, calculer un cosinus et
un sinus et tracer un trait ne prendra au pire que quelques
millisecondes. Tu as au pire 10 à 20 fois plus de temps que nécessaire.

Et même si tu voulais encore 10 minidéplacements entre graduations,
cela ne ferait que 10 fois plus, à savoir 16 millisecondes par
affichage, ce qui est encore très gérable.

Rien de hardware ne pouvant donc expliquer le comportement que tu
décris, tes calculs d'intervalles sont donc simplement faux. Pourquoi?

Une erreur classique est de se fier au Timer pour calculer un temps
écoulé. En dessous d'une certaine valeur (plus ou moins 100 ms), les
résultats deviennent faux. Tu peux utiliser le timer comme *évènement*,
si tu n'est pas à 2 ou 3 millisecondes pour le déclenchement, mais
surement pas comme BASE de temps.

Il y a des API faites pour cela, comme par exemple GetTickCount() dont
l'emploi est recommandé pour faire ce genre de choses, lorque l'on a
besoin de précision.

Conseil: garde ton timer pour avoir un évènement, met une valeur de
l'ordre d'une 20aine de millisecondes (ca te fait en gros 10 passages
intermédiaires entre graduations dans le pire des cas, MAIS ne te fie
pas au nombre de fois ou tu passes dans le Timer comme REFERENCE de
temps (je suppose que tu fais un cumul).

Utilise au contraire une base de temps certaine (GetTickCount est faite
pour cela). Grace à cela, je peux te garantir que tu peux faire une
horloge qui fera un tour complet avec une précision de l'odre de 10
millisecondes, sur n'importe quel ordinateur, aussi vieux soit il. Si
la machine est une antiquité, genre un 386 à 40 Mhz, je peux te
garantir que ca marchera, je peux même te dire que la précision sera
dans le pire des cas de 18,6 millisecondes (les anciens savent
pourquoi...), ce qui te fait au pire une erreur moyenne entre tes 50
graduations de 18,6/50 soit 0,3 millisecondes! J'ai écrit des choses
dans
ce genre la sur des 286/20 Mhz, en QBasic, au milieu des années 80 et ça
marchait déjà trèsz bien, alors tu penses :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;

"TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
news:drtsia$a86$
Héo...

Cela fait trois jours que je suis sur un problème que je modèle de


toute
part sans aboutir à un résultat stable.

Je résume mon projet :

* J'ai un cercle (horloge) dont le nombre de graduation peut aller de


1 à 50
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une


vitesse
définie (8, 9, ... 60 s par tour) dans un sens ou dans l'autre
* J'ai cinq boutons :
- deux doivent permettre de faire un tour complet à l'aiguille dans un


sens
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation


dans
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle


se
trouvera juste devant une graduation

Dans le timer réglé à 10ms,
* J'appelle une sub d'affichage de l'anneau et des graduations
* puis j'appelle une sub d'affichage de l'aiguille(avec calcul sin et


cos et
sub "trace")
et tout cela(dans le cas le plus défavorable) pour qu'au bout de 8s
l'aiguille est fait un tour complet

J'utilise pour le traçage graphique des API pour obtenir des


extrémités
plates pour les lignes d'épaisseur importante

Sub trace(XD, YD, XF, YF, col, DW)
Dim ExtendedPen&, di&
Dim Brushinfo As LOGBRUSH
Brushinfo.lbColor = col
Brushinfo.lbStyle = BS_SOLID

ExtendedPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_FLAT Or
PS_JOIN_ROUND, DW, Brushinfo, 0, ByVal 0&)
OldPen = SelectObject(pic.hdc, ExtendedPen&)
di = BeginPath(pic.hdc)
pic.Line (XD, YD)-(XF, YF)
di = EndPath(pic.hdc)
di = StrokePath(pic.hdc)
di = SelectObject(pic.hdc, OldPen)
di = DeleteObject(ExtendedPen)
End Sub

Je réalise le projet sur une machine cadencée à 1.67 GHz avec une


carte
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le


temps
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :


Le
temps d'exécution à un retard de deux secondes

Que pourrais-je encore faire pour aboutir au résultat conforme quelque


soit
la situation???????

Un grand... mais Grand merci d'avance pour votre aide

--
Guy







Avatar
X
18,6/s = cycle des résidents en ram


"Jean-Marc" a écrit dans le message de news:
43e28025$0$1158$
Hello,

tes calculs de temps sont de toute évidence faux, car un simple calcul
montre que même dans le cas le plus défavorable, l'aiguille doit
parcourir 50 graduations en 8 secondes à savoir au pire 6,25 affichages
par seconde (ce qui nous laisse exactement 160 ms pour faire un
affichage).

Or 160 millisecondes, c'est un énorme temps. Même pour une très vielle
machine avec une carte graphique préhistorique, calculer un cosinus et
un sinus et tracer un trait ne prendra au pire que quelques
millisecondes. Tu as au pire 10 à 20 fois plus de temps que nécessaire.

Et même si tu voulais encore 10 minidéplacements entre graduations,
cela ne ferait que 10 fois plus, à savoir 16 millisecondes par
affichage, ce qui est encore très gérable.

Rien de hardware ne pouvant donc expliquer le comportement que tu
décris, tes calculs d'intervalles sont donc simplement faux. Pourquoi?

Une erreur classique est de se fier au Timer pour calculer un temps
écoulé. En dessous d'une certaine valeur (plus ou moins 100 ms), les
résultats deviennent faux. Tu peux utiliser le timer comme *évènement*,
si tu n'est pas à 2 ou 3 millisecondes pour le déclenchement, mais
surement pas comme BASE de temps.

Il y a des API faites pour cela, comme par exemple GetTickCount() dont
l'emploi est recommandé pour faire ce genre de choses, lorque l'on a
besoin de précision.

Conseil: garde ton timer pour avoir un évènement, met une valeur de
l'ordre d'une 20aine de millisecondes (ca te fait en gros 10 passages
intermédiaires entre graduations dans le pire des cas, MAIS ne te fie
pas au nombre de fois ou tu passes dans le Timer comme REFERENCE de
temps (je suppose que tu fais un cumul).

Utilise au contraire une base de temps certaine (GetTickCount est faite
pour cela). Grace à cela, je peux te garantir que tu peux faire une
horloge qui fera un tour complet avec une précision de l'odre de 10
millisecondes, sur n'importe quel ordinateur, aussi vieux soit il. Si
la machine est une antiquité, genre un 386 à 40 Mhz, je peux te
garantir que ca marchera, je peux même te dire que la précision sera
dans le pire des cas de 18,6 millisecondes (les anciens savent
pourquoi...), ce qui te fait au pire une erreur moyenne entre tes 50
graduations de 18,6/50 soit 0,3 millisecondes! J'ai écrit des choses
dans
ce genre la sur des 286/20 Mhz, en QBasic, au milieu des années 80 et ça
marchait déjà trèsz bien, alors tu penses :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;

"TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
news:drtsia$a86$
Héo...

Cela fait trois jours que je suis sur un problème que je modèle de


toute
part sans aboutir à un résultat stable.

Je résume mon projet :

* J'ai un cercle (horloge) dont le nombre de graduation peut aller de


1 à 50
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une


vitesse
définie (8, 9, ... 60 s par tour) dans un sens ou dans l'autre
* J'ai cinq boutons :
- deux doivent permettre de faire un tour complet à l'aiguille dans un


sens
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation


dans
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle


se
trouvera juste devant une graduation

Dans le timer réglé à 10ms,
* J'appelle une sub d'affichage de l'anneau et des graduations
* puis j'appelle une sub d'affichage de l'aiguille(avec calcul sin et


cos et
sub "trace")
et tout cela(dans le cas le plus défavorable) pour qu'au bout de 8s
l'aiguille est fait un tour complet

J'utilise pour le traçage graphique des API pour obtenir des


extrémités
plates pour les lignes d'épaisseur importante

Sub trace(XD, YD, XF, YF, col, DW)
Dim ExtendedPen&, di&
Dim Brushinfo As LOGBRUSH
Brushinfo.lbColor = col
Brushinfo.lbStyle = BS_SOLID

ExtendedPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_FLAT Or
PS_JOIN_ROUND, DW, Brushinfo, 0, ByVal 0&)
OldPen = SelectObject(pic.hdc, ExtendedPen&)
di = BeginPath(pic.hdc)
pic.Line (XD, YD)-(XF, YF)
di = EndPath(pic.hdc)
di = StrokePath(pic.hdc)
di = SelectObject(pic.hdc, OldPen)
di = DeleteObject(ExtendedPen)
End Sub

Je réalise le projet sur une machine cadencée à 1.67 GHz avec une


carte
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le


temps
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :


Le
temps d'exécution à un retard de deux secondes

Que pourrais-je encore faire pour aboutir au résultat conforme quelque


soit
la situation???????

Un grand... mais Grand merci d'avance pour votre aide

--
Guy







Avatar
X
Bonjour,

Faut peut être voir du côté de l'occupation du processeur, des
programmes résidents, etc... Si le processeur est sollicité en permanence,
dans les respect des priorités de tâches, c'est quand même chacun sont tour
:o)

Tu dis: "* J'appelle une sub d'affichage de l'anneau et des
graduations"...
Peut être qu'en ne réaffichant pas tout, mais juste les graduations effacées
par l'aiguille, on peut gagner du temps (select case graduation ...
réaffichage_effacé_par_aiguille) si ce n'est déjà fait...

Tu peux laisser en permanence l'affichage des graduations, mais utiliser
un objet "shape/ ligne", l'avantage serait que tu n'aurais pas à effacer
l'ancienne position, ni a réinscrire les graduations...

In fine, tu peux tester avec le code VB "line",etc... (à la place des
API), et comparer, je ne sais pas ce qui est le plus performant ???

------------------

"TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de news:
drtsia$a86$
Héo...

Cela fait trois jours que je suis sur un problème que je modèle de toute
part sans aboutir à un résultat stable.

Je résume mon projet :

* J'ai un cercle (horloge) dont le nombre de graduation peut aller de 1 à
50 (ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une vitesse
définie (8, 9, ... 60 s par tour) dans un sens ou dans l'autre
* J'ai cinq boutons :
- deux doivent permettre de faire un tour complet à l'aiguille dans un
sens
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation dans
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle se
trouvera juste devant une graduation

Dans le timer réglé à 10ms,
* J'appelle une sub d'affichage de l'anneau et des graduations
* puis j'appelle une sub d'affichage de l'aiguille(avec calcul sin et cos
et sub "trace")
et tout cela(dans le cas le plus défavorable) pour qu'au bout de 8s
l'aiguille est fait un tour complet

J'utilise pour le traçage graphique des API pour obtenir des extrémités
plates pour les lignes d'épaisseur importante

Sub trace(XD, YD, XF, YF, col, DW)
Dim ExtendedPen&, di&
Dim Brushinfo As LOGBRUSH
Brushinfo.lbColor = col
Brushinfo.lbStyle = BS_SOLID

ExtendedPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_FLAT Or
PS_JOIN_ROUND, DW, Brushinfo, 0, ByVal 0&)
OldPen = SelectObject(pic.hdc, ExtendedPen&)
di = BeginPath(pic.hdc)
pic.Line (XD, YD)-(XF, YF)
di = EndPath(pic.hdc)
di = StrokePath(pic.hdc)
di = SelectObject(pic.hdc, OldPen)
di = DeleteObject(ExtendedPen)
End Sub

Je réalise le projet sur une machine cadencée à 1.67 GHz avec une carte
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le temps
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée : Le
temps d'exécution à un retard de deux secondes

Que pourrais-je encore faire pour aboutir au résultat conforme quelque
soit la situation???????

Un grand... mais Grand merci d'avance pour votre aide

--
Guy



Avatar
TouTi
Jean marc et Christian

* Jean marc tu as très bien compris mon projet, j'avais effectivement omis
de préciser que le mouvement ne doit pas être saccader entre les
graduations. Le nombre de déplacement est bien supérieur au nbr de
graduation.
* Vous confirmez aussi les infos de Zouri sur la précision des temps et des
outils disponibles. J'utilise effectivemement l'APi GetTickCount() pour
contrôler le temps d'exécution mais pas pour gérér les déplacements.
Je ne vois pas encore bien comment je vais pouvoir l'inclure.... Help....

X
Faut peut être voir du côté de l'occupation du processeur, des
programmes résidents, etc... Si le processeur est sollicité en permanence,
dans les respect des priorités de tâches, c'est quand même chacun sont tour



Et c'est là aussi que le bas blesse, car je dois réafficher à chaque fois la
base de "l'horloge" (anneau et graduations). Pour éviter ce problème j'avais
pensé à superposer deux pictures :
* Une inférieur qui affichera la base (on l'affiche qu'une seule fois)
* Une supérieure(superposée à la base) qui affichera l'aiguille : Traçage
puis mise en transparence autour de son contour. La question du temps
d'éxécution reste peut être un problème (j'ai pas encore essayé)

Comme l'aiguille est large et les extrémités doivent être plates, j'ai opté
pour l'API : Je pense qu'il est plus rapide de calculer deux points que 4
puis remplir l'objet ????

Merci merci on avance....
--
Guy
Avatar
jean-marc
Hello,

Il convient si on ne s'en sert pas comme base de temps et si
on n'a pas beoin d'une précision temporelle extrème pour
le déclenchement de l'évènement.
Si on a besoin de faire des choses plus précises, on ne le
fait pas en VB et de fait, on utilise d'autres techniques
qui n'utilisent pas un Timer.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;


"Christian Hugoud" wrote in message
news:
Pas mieux : le timer ne convient pas pour ce type de traitement.


"Jean-Marc" a écrit dans le message de


news:
43e28025$0$1158$
> Hello,
>
> tes calculs de temps sont de toute évidence faux, car un simple calcul
> montre que même dans le cas le plus défavorable, l'aiguille doit
> parcourir 50 graduations en 8 secondes à savoir au pire 6,25 affichages
> par seconde (ce qui nous laisse exactement 160 ms pour faire un
> affichage).
>
> Or 160 millisecondes, c'est un énorme temps. Même pour une très vielle
> machine avec une carte graphique préhistorique, calculer un cosinus et
> un sinus et tracer un trait ne prendra au pire que quelques
> millisecondes. Tu as au pire 10 à 20 fois plus de temps que nécessaire.
>
> Et même si tu voulais encore 10 minidéplacements entre graduations,
> cela ne ferait que 10 fois plus, à savoir 16 millisecondes par
> affichage, ce qui est encore très gérable.
>
> Rien de hardware ne pouvant donc expliquer le comportement que tu
> décris, tes calculs d'intervalles sont donc simplement faux. Pourquoi?
>
> Une erreur classique est de se fier au Timer pour calculer un temps
> écoulé. En dessous d'une certaine valeur (plus ou moins 100 ms), les
> résultats deviennent faux. Tu peux utiliser le timer comme *évènement*,
> si tu n'est pas à 2 ou 3 millisecondes pour le déclenchement, mais
> surement pas comme BASE de temps.
>
> Il y a des API faites pour cela, comme par exemple GetTickCount() dont
> l'emploi est recommandé pour faire ce genre de choses, lorque l'on a
> besoin de précision.
>
> Conseil: garde ton timer pour avoir un évènement, met une valeur de
> l'ordre d'une 20aine de millisecondes (ca te fait en gros 10 passages
> intermédiaires entre graduations dans le pire des cas, MAIS ne te fie
> pas au nombre de fois ou tu passes dans le Timer comme REFERENCE de
> temps (je suppose que tu fais un cumul).
>
> Utilise au contraire une base de temps certaine (GetTickCount est faite
> pour cela). Grace à cela, je peux te garantir que tu peux faire une
> horloge qui fera un tour complet avec une précision de l'odre de 10
> millisecondes, sur n'importe quel ordinateur, aussi vieux soit il. Si
> la machine est une antiquité, genre un 386 à 40 Mhz, je peux te
> garantir que ca marchera, je peux même te dire que la précision sera
> dans le pire des cas de 18,6 millisecondes (les anciens savent
> pourquoi...), ce qui te fait au pire une erreur moyenne entre tes 50
> graduations de 18,6/50 soit 0,3 millisecondes! J'ai écrit des choses
> dans
> ce genre la sur des 286/20 Mhz, en QBasic, au milieu des années 80 et ça
> marchait déjà trèsz bien, alors tu penses :-)
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
> "TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
> news:drtsia$a86$
>> Héo...
>>
>> Cela fait trois jours que je suis sur un problème que je modèle de
> toute
>> part sans aboutir à un résultat stable.
>>
>> Je résume mon projet :
>>
>> * J'ai un cercle (horloge) dont le nombre de graduation peut aller de
> 1 à 50
>> (ces graduations ont une épaisseur importante)
>> * J'ai une aiguille(épaisseur importante) qui doit tourner à une
> vitesse
>> définie (8, 9, ... 60 s par tour) dans un sens ou dans l'autre
>> * J'ai cinq boutons :
>> - deux doivent permettre de faire un tour complet à l'aiguille dans un
> sens
>> ou dans l'autre
>> - deux doivent permettre de décaler l'aiguille d'une seule graduation
> dans
>> un sens ou dans l'autre
>> - le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
> se
>> trouvera juste devant une graduation
>>
>> Dans le timer réglé à 10ms,
>> * J'appelle une sub d'affichage de l'anneau et des graduations
>> * puis j'appelle une sub d'affichage de l'aiguille(avec calcul sin et
> cos et
>> sub "trace")
>> et tout cela(dans le cas le plus défavorable) pour qu'au bout de 8s
>> l'aiguille est fait un tour complet
>>
>> J'utilise pour le traçage graphique des API pour obtenir des
> extrémités
>> plates pour les lignes d'épaisseur importante
>>
>> Sub trace(XD, YD, XF, YF, col, DW)
>> Dim ExtendedPen&, di&
>> Dim Brushinfo As LOGBRUSH
>> Brushinfo.lbColor = col
>> Brushinfo.lbStyle = BS_SOLID
>>
>> ExtendedPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_FLAT Or
>> PS_JOIN_ROUND, DW, Brushinfo, 0, ByVal 0&)
>> OldPen = SelectObject(pic.hdc, ExtendedPen&)
>> di = BeginPath(pic.hdc)
>> pic.Line (XD, YD)-(XF, YF)
>> di = EndPath(pic.hdc)
>> di = StrokePath(pic.hdc)
>> di = SelectObject(pic.hdc, OldPen)
>> di = DeleteObject(ExtendedPen)
>> End Sub
>>
>> Je réalise le projet sur une machine cadencée à 1.67 GHz avec une
> carte
>> graphique rapide : Tout fonctionne impeccable
>> Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
> temps
>> d'exécution est presque multiplié par deux
>> Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
> Le
>> temps d'exécution à un retard de deux secondes
>>
>> Que pourrais-je encore faire pour aboutir au résultat conforme quelque
> soit
>> la situation???????
>>
>> Un grand... mais Grand merci d'avance pour votre aide
>>
>> --
>> Guy
>>
>>
>




Avatar
Vincent Guichard
Bonjour,

As-tu envisagé de créer ton horloge comme un composant ActiveX autonome
ou un contrôle utilisateur?

Je pense que cela peut-être une bonne piste pour avoir quelque chose de
plus fluide.

Vincent Guichard
Avatar
TouTi
> Si on a besoin de faire des choses plus précises, on ne le
fait pas en VB et de fait, on utilise d'autres techniques
qui n'utilisent pas un Timer.



Tu veux me gacher le moral.... ???? :-(

On va bien trouver une solution...


--
Guy
Avatar
TouTi
> As-tu envisagé de créer ton horloge comme un composant ActiveX autonome ou
un contrôle utilisateur?
Je pense que cela peut-être une bonne piste pour avoir quelque chose de
plus fluide.


Tu crois que c'est vraiment nécessaire????*


J'aurais jamais pensé que mon projet soit aussi hard...

--
Guy
Avatar
Vincent Guichard
TouTi a écrit :
As-tu envisagé de créer ton horloge comme un composant ActiveX autonome ou
un contrôle utilisateur?
Je pense que cela peut-être une bonne piste pour avoir quelque chose de
plus fluide.


Tu crois que c'est vraiment nécessaire????*




Pas forcément. C'est ce que je ferrais si j'avais à le faire, mais
principalement parce que ça ne me demanderais pas trop de travail (en
modifiant légèrement des contrôles déjà réalisés). Sinon ça tient la
route au niveau conceptuel: ton horloge est un objet avec des propriétés
(dimensions, nombre de graduations, ...) et des méthodes (Arrêt, Marche,
...), c'est pour ça que j'avais avancé cette solution.

Vincent Guichard
1 2