2 boucles qui ne veulent pas marcher en mm tps

Signaler
Messages postés
37
Date d'inscription
jeudi 20 avril 2006
Statut
Membre
Dernière intervention
26 avril 2006
-
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
-
Bonjour, g un probleme avec deux boucles que je n'arrive pas a faire marcher simultanément!!
C soit l'une soit l'autre mais pas les deux en meme temps, alors qu'il le faut!!
Auriez vous une idée pour y remédier???
Voici mon programme:


#include
<stdio.h>
#include
<conio.h>
#include
<stdlib.h>
#include
<time.h>
void clrscr()
/*fonction qui recupere le code acii des touches*/
{

int c;
flushall();
c= getch();

if(c==0)
{
c= getch();
}
getch();
}

void time()
/*fonction qui effectue un decompte du temps en seconde*/
{

int i,n;
n=1000;
i=clock_t()/CLOCKS_PER_SEC;

for(i=0;i<n;i++)
{
system(
"cls");
printf(
"%d\n",i);
_sleep(1000);
}
}

void main()
{

int variable=0;

char touche;
time();
/* Premier boucle*/
do/*deuxieme boucle permettant d'associer a l'appui des fleches le changement de la variable*/
{
fflush(stdin);
touche = getch();
clrscr();

switch(touche)
{

case 72 : system(
"cls");
/* fleche du haut détectée (valeur ASCII) */
variable += 10;
/* augmentation de la variable */
printf(
"La voiture roule à %ikm/h", variable);

break;

case 80: system(
"cls");
/* fleche du bas détectée */
variable -= 10;
/*diminution de la variable*/
printf(
"La voiture roule à %ikm/h", variable);

break;
}
}

while(touche!=13);
/* tant qu'on appuie pas sur entrée, on boucle */
}

11 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Faut mettre chaque boucle dans un thread séparé.

ciao...
BruNews, MVP VC++
Messages postés
37
Date d'inscription
jeudi 20 avril 2006
Statut
Membre
Dernière intervention
26 avril 2006
2
Merci de repondre si vite, mais je suis debuitant et je ne connait pas les thread!!
pourrait tu m'explique comment met-on chaque boucle dans un thread séparer, stp!!!!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Sous Windows:
voir CreateThread() dans MSDN et Richter:
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip

ciao...
BruNews, MVP VC++
Messages postés
37
Date d'inscription
jeudi 20 avril 2006
Statut
Membre
Dernière intervention
26 avril 2006
2
IL n'y a qu'un seul des deux liens qui s'ouvre et je ne trouve pas!!!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Les 2 liens sont bons, enregistre sur disque dur et dézippe ensuite.
Threads, chapitres 6 à 11 inclus.

ciao...
BruNews, MVP VC++
Messages postés
37
Date d'inscription
jeudi 20 avril 2006
Statut
Membre
Dernière intervention
26 avril 2006
2
C gentil de tas part, mais le manuel tt en anglais c pas trop mon truc!! deja qu'en francais g du mal en info!!!
Ce que je cherche exactement c a faire demarré de 0 le decompte du temps chaque fois que j'appuit sur une fleche!!
Saurait tu coment faire??
C un projet pour mes étude et le temps presse!!
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

Bon explications, un programme classique n'a qu'une thread, cela veut dire qu'il ne peut pas faire plus de une chose a la fois.
Avec 2 threads on peut en faire 2 à la fois mais faut synchroniser c'est le gros bordel.

Pour ce dont tu as besoin il y a une solution trés simple en mono-thread.
Windows integre une fonction qui s'appelle GetTickCount, elle compte le nb de milisecondes qui se sont écoulés depuis le lancement de l'OS.
Donc, quand on appuis sur une touche, il recupere ce temps. Ensuite pour recuperer le temps qu'il c'est passé depuis cet appuis, tu fais la soustraction entre le nouveau résultat de GetTickCount et l'ancien que tu avais stocké dans une variable.

J'ai été clair ?
Messages postés
37
Date d'inscription
jeudi 20 avril 2006
Statut
Membre
Dernière intervention
26 avril 2006
2
ok merci, je vais essayer ca !!! sinon c clair, lol!!!
cettefonction est dans les #include ?
Messages postés
193
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
8 juillet 2010

lui je sais pas, mais moi j'ai tout comprit ;D-->merci beaucoup
Messages postés
37
Date d'inscription
jeudi 20 avril 2006
Statut
Membre
Dernière intervention
26 avril 2006
2
Non t'a solution ne marche pas car j'ai besoin de l'évolution du temps sans appuyer sur une autre touche!!
je m'explique, il s'agit d'un ordinateur de bord d'une voiture!!
en apuyant sur la fleche haut la vitesse de la voiture augmente et j'ai besoin de calculer la distance parcourue par la voiture de maniere instantanée!! ce qui veut dire qu'en restant a la meme vitesse pendant un quart d'heure ( ca dire sans appuyer sur une autre fleche) la distance parcourue doit evolué sans cesse!
donc ta solution ne marche pas!!
Mais je suis sur une piste qui qui permettrait de calculer la distance pour chaque seconde et de l'additioné a la distance d'avant!!! mais il y'a encore ce probleme de decompte du temps!!!
Si vous avez une idée , je vous suit!! car moi je me prend la tete la dessus depuis un moment!!
merci.
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
Salut,
C'est la solution de BruNews

// Vroom.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>

void Erreur (char *Msg) {

fprintf(stderr, Msg);
ExitProcess (1);
}

int getKey() { /* fonction qui lit le buffer clavier */

int c; if ( !( c getch()) ) c getch();
return c;
}

DWORD WINAPI ThreadOne (LPVOID lpvThreahParam) {

int i,n;
n = 1000;
i = clock_t()/CLOCKS_PER_SEC;
for ( i = 0; i < n; i++) {
system("cls");
printf("%d\n",i);
_sleep(1000);
}
return (0);
}

int main(int argc, char* argv[])
{
HANDLE hThreadOne;
DWORD dwThreadId;

hThreadOne = CreateThread(NULL,0,ThreadOne, NULL,0, &dwThreadId);
if ( hThreadOne == NULL ) Erreur ("CreateThread(One)");

fflush(stdin);
/* deuxieme boucle permettant d'associer a l'appui des fleches le changement de la variable*/
int vitesse = 0;
char verbe[10];
char touche;
do {
switch(touche = getKey()) {
case 72 :
system("cls");/* fleche du haut détectée (valeur ASCII) */
/* augmentation de la vitesse */
strcpy(verbe, (vitesse < 300) ? "roule" : "vole");
printf("La voiture %s à %i km/h", verbe, vitesse += 10);
break;
case 80:
system("cls"); /* fleche du bas détectée */
/* diminution de la vitesse */
if (vitesse || vitesse == 10 ) printf("La voiture roule à %i km/h", vitesse -= 10);
else { printf ("la voiture est arrétée\n"); vitesse = 0; }
break;
}
} while (touche != 13); /* tant qu'on appuie pas sur entrée, on boucle */

TerminateThread(hThreadOne, 0);
CloseHandle(hThreadOne);
return 0;
}

Si maintenant tu veux que le compteur (ThreadOne) te donne en plus la distance parcourue, il faut que tu mettes en place un système de communication entre ThreadMain et ThreadOne. De cette manière, chaque fois qu'on appuie sur une touche + ou -, le ThreadOne est mis au courant du changement de vitesse et peut ajuster ses calculs de distances.
Pour le système de communication, tu as principalement le choix entre mutex, semaphores ou evenements. Sinon il ya peut être aussi les IPC ou les segments de memoire partagé mais pas sûr avec windows.