Probleme d'appel de TIMER

Résolu
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012 - 13 juin 2005 à 16:23
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012 - 15 juin 2005 à 09:56
Bonjour a vous!!!

Je souhaite appeler un Timer avec SetTimer(...) au MILIEU d'une boucle FOR;

Mais le probleme, c'est que le Timer ne se lance QU'APRES la boucle for( il se met dans la file d'attente);

Algo:



for (int i=0;i< nombre_de_boucle; i++)

{

-->Traitement

-->Traitement

-->Traitement

Appel du TIMER

-->Traitement

-->Traitement

}

Avez vous une idée????

22 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 juin 2005 à 17:54
Je t'explique la deuxième: GetTickCount te donne le nb de millisecondes ecoulées depuis que ta session est ouverte.

Je prends la valeur à un moment, puis je fais la différence avec le
nombre de millisecondes actuelle. 5 secondes après le premier appel à
GetTickCount, le test GetTickCount() - 5000 < 5000 sera vrai

C'est si compliqué?
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 juin 2005 à 16:32
SetTimer() n'appelle pas le timer mais crée un timer, bien certain que tu veuilles faire cela ??? bizzare.

ciao...
BruNews, MVP VC++
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
13 juin 2005 à 16:34
Ben en fait, je veux l'appeler (avec une autre fonction que Set s'il le
faut) mais il dois s'executer dans mon algo et pas après!!!

tu vois?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 juin 2005 à 16:40
Mets une fonction callback pour ces timers et tu pourras appeler toi même ces fonctions dans ta boucle.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
13 juin 2005 à 16:47
merci!!

Et... euh? Comment que ça marche les fonctions CALLBACK????

J'ai essayé de comprendre le principe sur MSDN mais je vois pas comment la coder!!

tu n'a pas un exemple??stp?

Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 juin 2005 à 16:57
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
// toutes les 1 seconde:
idTim = SetTimer(0, 0, 1000, TimerProc);

et tu pux appeler ta TimerProc toi même en lui passant ce que tu veux en param.

ciao...
BruNews, MVP VC++
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
13 juin 2005 à 17:01
ok merci, je vais voir ce que ca donne!!!!
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
13 juin 2005 à 17:21
Les parametres que tu passes (0,0,1000,TimerProc) => les 2 '0' correspondent a koi?

Et sinon, j'avoue me sentir bete devant le protoype de la fonction CALLBACK:

en structure HWND je ne sais pas quoi passer, et pour uMSG je ne vois pas non plus!!

tu as une aide qui va avec??? lol!!

Merci!
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
13 juin 2005 à 17:53
Je n'arrive pas à coder ton exemple, les parametres ne sont pas dans l'ordre, et il fait planter Visual!!

- J'utilise un prototype en debut de code pour nommer ma fonction callback?

- apres je met la definition de cette fonction plus bas (pour l'instant
vide car je ne sais pas comment elle fonctionne donc encore moins quoi
y mettre)

- et j'utilise cette fonction pour appeler mon timer mais comme la fonction est vide, il ne se passe rien!!

Pouvez vous m'aider?? Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 juin 2005 à 18:20
Regarde ici:
http://www.cppfrance.com/code.aspx?id=23303
y a un SetTimer avec un callbackProc.
Quand on fournit un callbackProc pas obligé de fournir les 2 premiers params, 0 suffit.
Pour le reste, lire MSDN.

ciao...
BruNews, MVP VC++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 juin 2005 à 11:14
Tu es bien sur qu'il faut utiliser un Timer pour ca? Pourquoi pas un
simple appel de fonction (tu dis qu'il doit être appelé pendant ton
algo et pas après).



for (int i=0;i< nombre_de_boucle; i++)

{

-->Traitement

-->Traitement

-->Traitement

Appel de la fonction

-->Traitement

-->Traitement

}
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
14 juin 2005 à 11:46
Et dans ce cas la, je place SetTimer dans ma fonction?

Mais se lancera t'il à ce moment la ou attendra t'il d'avoir terminé la boucle for??
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 juin 2005 à 11:51
Je dois mal comprendre, mais j'ai l'impression que tu n'a pas besoin
d'un timer. Pourquoi veux-tu en utiliser un en fait? On utilise les
timer pour faire un opération toutes les n millisecondes, or dans ton
cas je crois que tu n'en a pas besoin (de toutes facons, il serait
plutot étrange de créer un Timer dans une boucle, ca veut dire que va
créer plusieurs fois le même timer)
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
14 juin 2005 à 11:52
En fait, mon programme est assez délika, je suis dans une boucle FOR,
et la j'appel un Timer, mais a un certain moment de ce timer, je dois
l'arreter pour en lancer un autre qui lui contient d'autre
fonction, c'est un peu chau à expliqueralors voila:



For (int i=0;i<nombre;i++)

{

<<Traitement>>

Demare TIMER1

<<Traitement>>

}



Timer1( )

{

<<Decomptage>>

<>

Test( )

Demarre TIMER2

Sinon

Retour dans le For

Fin Test

<>

}



Timer2 ( )

{

<<Lecture Port Serie>>

<<Traitement>>

}



Et la je pense que c plus clair a comprendre!! non?

Mais ca ne marche pas!!!!!
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
14 juin 2005 à 11:58
Ok alors je reprend:

Mon appli doit envoyer quatres valeurs au port Serie; (cas normal)

Ces 4 parametre (représentant des durées) donnent un temps (que je fais decompter dans mon Timer1)

Mais dans un autre cas, je souhaite envoyer Plusieurs ligne de 4 parametre;

Attendre une réponse du port,

Decompter la durée de cette ligne,

Effectuer des opérations sur les valeurs

Puis envoyer une deuxieme ligne de 4 parametres differents,

Attendre une réponse du port,


Decompter la durée de cette ligne,


Effectuer des opérations sur les valeurs

ETC......

Je suis d'accord qu'on peut surement le faire sans Timer mais étant
donné mon niveau (pas expert) Je suis ouvert a toute suggestions!!

Alors n'ésite pas a proposer!!

Merci de ton aide!
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
14 juin 2005 à 16:04
Voici mon algo:





ALGO: Envoye par le port Serie...





APPLI



CARTE



-----



-----



|



|



|



|



|



|



|




|

FAIRE - - - - - - - |



|

|

|



|

| |------->----->--|




|

| |

|



|

| |

|



|

| | FAIRE
- |
EnvoyDonnee(a[i],b[i],c[i],d[i] ) |

| |
|
|-------------------------------------->
|->-

| |
|
|
ACK


| | Processus

| |
|

|<---------------------------------------|-<-

| | TANT QUE
|



|

| | (pas
ack)||(t<5s)





| |

|




|

| | FAIRE -- -
|->-


|->-

| |
|
| | Decremente
date[i]
| |
Processus

| |
|
|-<-



| |

| |
|
|



| |

| (i++) |
|



|
|

| |
|
|
EnvoyFin()

| |

| |
|

|<----------------------------------------|-<-

| |
|
|



|

| | TANT QUE
|

|

| | (date[i]>0)&&(!fin)

| |

|



|

| | FAIRE
- |
EnvoyStop()

|

| |
|

|----------------------------------------->|->-

| |
|
|
ACK


| | Processus

| |
|

|<-----------------------------------------|-<-

| | TANT QUE
-|



|

| | (pas ack)||(t<5s)

| |

|

| |

|

| |

|

| |------<--<------|

|

|

TANT QUE - - - |

(i<nbRep*nbDate)



FIN

Je sais, il est hideux mais g ke ça!!!

Dans chaque passage ou j'attend une réponse (ACK) je dois temporiser pendant 5 secondes mais sans bloker le prog!!

Dans le bloc central (Decremente date[i]) je fais aussi une tempo (de la durée de la date[i])

Comment feriez vous?????
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 juin 2005 à 16:16
J'ai pas répondu avant parce que je comprenais pas trop, et je crois
que ca ne s'arrange pas avec ce schéma, je sais pas trop par ou
commencer. Je me demande si tu ne devrais pas utiliser des thread.

Une question tout d'abord:



For (int i=0;i<nombre;i++)

{

<<Traitement>>

Demare TIMER1

<<Traitement>> ce traitement commence quand? tout de suite ou quand timer1 est terminé??

}
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
14 juin 2005 à 16:44
Il commence quand le timer est terminé

Mais tu me parles de thread, j'en ai entendu parler mais c tout!!

En fait, c'est une de mes premieres application sous visual, donc je suis encore débutant!!

Et je suis parti sur des timers parce que ca compte/decompte a un rythme fixe

pas comme une incrémentation de variable (vitesse CPU)

Maintenant, si tu me dis que ce serai mieu avec des thread je suis tout ouie; et je te remercie pour ta patience!!

L'algo que j'ai esaye de représenter consiste a envoyer des donnée (ca
tu l a compri) sur le port serie, a attendre pendant 5secondes au
maximum (timer1) une reponse du port (ACK) en cas de non-réponse,(
réenvoyer les données et attendre un ACK)x5;



Une fois le ACK recu, une date se décremente (au rythme d'un timer2 de 10ms de pas)

Quand le date est nulle, et que la carte sur port serie m'envoi son
"FIN" je dois envoyer une confirmation a cette carte, attendre un ACK,
et comme au début: en cas de non reponse, réenvoyer la confirmation 5
fois max pdt 5s max!

Euh, tu vois le principe??
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 juin 2005 à 17:39
D'accord, en fait tu veux fixer une limite de 5 secondes pour recevoir un message.

Je pense que la fonction WaitForSingleObject devrait t'aider (désolé de
te donner des pistes différentes à chaque fois). Cette fonction te
permet d'attendre un evenement, avec un temps limite d'attente de
l'événement.

Mais il me reste une question: comment est tu mis au courant de
l'acceptation (ack)? Est à toi de vérifier le contenu d'un variable?



Si c'est le cas, j'ai une autre proposition:

DWORD dwTime = GetTickCount();

do

{

Sleep(10);

} while(GetTickCount() - dwTime < 5000 && !ack)

if(!ack) // pas de réponse



je mets le Sleep(10) pour ne pas monopoliser l'UC

Cette solution est assez simple, répond-elle à ton problème?
0
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
14 juin 2005 à 17:49
Euh, comment les deux belles fonctions que tu me propose fonctionnent???

j'avoue qu'en fin de journée je suis un vrai légume!!!!!

Merci
0
Rejoignez-nous