Probleme d'appel de TIMER

Résolu
Signaler
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012
-
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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é?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
SetTimer() n'appelle pas le timer mais crée un timer, bien certain que tu veuilles faire cela ??? bizzare.

ciao...
BruNews, MVP VC++
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Mets une fonction callback pour ces timers et tu pourras appeler toi même ces fonctions dans ta boucle.

ciao...
BruNews, MVP VC++
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

ok merci, je vais voir ce que ca donne!!!!
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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!
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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

}
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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??
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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)
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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!!!!!
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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!
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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?????
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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é??

}
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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??
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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?
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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