Héo...
Cela fait trois jours que je suis sur un problème que je modèle de
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
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une
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
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
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
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
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
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
temps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque
la situation???????
Un grand... mais Grand merci d'avance pour votre aide
--
Guy
Héo...
Cela fait trois jours que je suis sur un problème que je modèle de
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
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une
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
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
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
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
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
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
temps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque
la situation???????
Un grand... mais Grand merci d'avance pour votre aide
--
Guy
Héo...
Cela fait trois jours que je suis sur un problème que je modèle de
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
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une
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
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
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
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
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
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
temps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque
la situation???????
Un grand... mais Grand merci d'avance pour votre aide
--
Guy
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
toutepart 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
vitessedé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
sensou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation
dansun sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
setrouvera 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 etsub "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ésplates 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
cartegraphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
tempsd'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
Letemps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque
soitla situation???????
Un grand... mais Grand merci d'avance pour votre aide
--
Guy
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_' ; _no_spam_jean_marc_n2@yahoo.fr
"TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
news:drtsia$a86$1@aphrodite.grec.isp.9tel.net...
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
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
toutepart 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
vitessedé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
sensou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation
dansun sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
setrouvera 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 etsub "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ésplates 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
cartegraphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
tempsd'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
Letemps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque
soitla situation???????
Un grand... mais Grand merci d'avance pour votre aide
--
Guy
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
toutepart 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
vitessedé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
sensou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation
dansun sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
setrouvera 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 etsub "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ésplates 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
cartegraphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
tempsd'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
Letemps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque
soitla situation???????
Un grand... mais Grand merci d'avance pour votre aide
--
Guy
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_' ; _no_spam_jean_marc_n2@yahoo.fr
"TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
news:drtsia$a86$1@aphrodite.grec.isp.9tel.net...
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
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
toutepart 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
vitessedé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
sensou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation
dansun sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle
setrouvera 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 etsub "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ésplates 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
cartegraphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le
tempsd'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée :
Letemps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque
soitla situation???????
Un grand... mais Grand merci d'avance pour votre aide
--
Guy
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
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
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
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
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
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
Pas mieux : le timer ne convient pas pour ce type de traitement.
"Jean-Marc" a écrit dans le message de
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
>>
>>
>
Pas mieux : le timer ne convient pas pour ce type de traitement.
"Jean-Marc" <NO_SPAM_jean_marc_n2@yahoo.fr> a écrit dans le message de
43e28025$0$1158$ba620e4c@news.skynet.be...
> 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_' ; _no_spam_jean_marc_n2@yahoo.fr
>
> "TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
> news:drtsia$a86$1@aphrodite.grec.isp.9tel.net...
>> 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
>>
>>
>
Pas mieux : le timer ne convient pas pour ce type de traitement.
"Jean-Marc" a écrit dans le message de
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
>>
>>
>
> 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.
> 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.
> 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.
> 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.
> 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.
> 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.
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????*
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????*
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????*