2 boucles qui ne veulent pas marcher en mm tps

florian1121 Messages postés 37 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 avril 2006 - 22 avril 2006 à 15:55
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 - 22 avril 2006 à 21:06
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 avril 2006 à 16:01
Faut mettre chaque boucle dans un thread séparé.

ciao...
BruNews, MVP VC++
0
florian1121 Messages postés 37 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 avril 2006 2
22 avril 2006 à 16:04
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!!!!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 avril 2006 à 16:11
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++
0
florian1121 Messages postés 37 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 avril 2006 2
22 avril 2006 à 16:19
IL n'y a qu'un seul des deux liens qui s'ouvre et je ne trouve pas!!!
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 avril 2006 à 16:32
Les 2 liens sont bons, enregistre sur disque dur et dézippe ensuite.
Threads, chapitres 6 à 11 inclus.

ciao...
BruNews, MVP VC++
0
florian1121 Messages postés 37 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 avril 2006 2
22 avril 2006 à 16:48
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!!
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
22 avril 2006 à 18:03
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 ?
0
florian1121 Messages postés 37 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 avril 2006 2
22 avril 2006 à 18:07
ok merci, je vais essayer ca !!! sinon c clair, lol!!!
cettefonction est dans les #include ?
0
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
22 avril 2006 à 18:07
lui je sais pas, mais moi j'ai tout comprit ;D-->merci beaucoup
0
florian1121 Messages postés 37 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 avril 2006 2
22 avril 2006 à 18:27
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.
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
22 avril 2006 à 21:06
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.
0
Rejoignez-nous