Posez votre question Signaler

Fonction Wait en C++ [Résolu]

totodude - Dernière réponse le 17 juin 2010 à 14:14
Salut tout le monde,

j'ai un pb en C++. mon prog n'attend pas une ligne de commande, ce qui a pour effet qu'il continue comme si elle n'avait pas été la.

du coup je voudrais mettre un truc du genre "Wait(temps)"

quelqu'un connaitrai la commande et les parametres a passer ?

merci bcp

tom
Lire la suite 

Fonction Wait en C++ »

11 réponses
Réponse
+4
moins plus
L'idée de faire une boucle for vide est mauvaise car les ordis récents vont la passer quasi instanément même avec une grande valeur. De plus le comportement sera différent d'une machine à l'autre.

La commande wait ne sert pas à attendre un certain temps mais attends un signal (cf cours de système).
http://pwet.fr/man/linux/appels_systemes/wait

Voici une manière plus ou moins propre de faire et qui se comportera toujours de la même façon :
#include <ctime>
#include <iostream>

int main(){
    time_t t0 = time(NULL);
    unsigned tmax = 2;
    std::cout << "j'attends " << tmax << " secondes" << std::endl;
    while(static_cast<unsigned>(time(NULL)-t0) < tmax);
    std::cout << tmax << "s écoulées" << std::endl;
    return 0;
}

Le problème c'est que ta charge CPU reste à 100% pendant l'attente des 2 secondes ce qui est un peu dommage vu qu'on ne fait rien. C'est pour ça que faire une boucle est une mauvaise idée. En fait il faut simplement endormir ton processus pendant tmax secondes :
extern "C"{
    #include <unistd.h>
}
#include <iostream>

int main(){
    unsigned tmax = 2;
    std::cout << "j'attends " << tmax << " secondes" << std::endl;
    sleep(tmax);
    std::cout << tmax << "s écoulées" << std::endl;
    return 0;
}


Bonne chance
Ajouter un commentaire
Réponse
+2
moins plus
ca n'est pas sleep() sous windows c'est Sleep() c la majuscule qui change
Ajouter un commentaire
Réponse
+0
moins plus
salut, si t'es sous windows, sleep.
si t'es sous unix, wait ou bien waitpid (fais un man).
Je ne peux pas t'aider plus, je ne comprends pas ta question.

tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
Ajouter un commentaire
Réponse
+0
moins plus
tu peux toujours utlisé getch();
ça va attendre jusqu'à ce que tu entre une donnée
au clavier.

ou tu peux toujours faire une boucle for comme l'a dit femi
genre:

for (int i=0; i<MAX_INT; i++)
{;}

fait des test pour voir la valeur de MAX_INT qui est la plus appropriée.

c'est tout ce que je peux dire...
Ajouter un commentaire
Réponse
+0
moins plus
ben merci d'avoir regarder, mais j'ai trouver une astuce.

j'avais déjà essayer sleep, mais ca ne suffisait pas. en fait le système attendait le temps que je lui disait, mais il réalisait pas l'enregistrement.

j'ai pas essayer la boucle for vide

en fait j'ai ouvert une boite de dialogue et simuler l'apuie sur le bouton entrer direct (ainsi la boite n'a meme pas le temps de s'afficher qu'elle se ferme), et ca marche comme ca.
ca donne un truc du genre

kbevent(VB_RETURN,0,0,0);
AfxMessageBox("");


les parametre sont a vérifier, j'ai plus le code sous les yeux.

merci tt le monde

cheers
tom
Ajouter un commentaire
Réponse
+0
moins plus
ok je vois
mais la fonction getch() marche t elle corectement chez toi moi j'ai pas pu l'utiliser pour faire les fpause et attendre que l'utilisateur tape une lettre!
Ajouter un commentaire
Réponse
+0
moins plus
Avant
int main()
tu dois écrire
-------
# include <conio.h>
--------
puis,à l'interieur du main()
tu dois écrire, au point ou tu veux faire la pause :
--------
int = ch;
ch = _getch();
--------
C'est tout !
Ajouter un commentaire
Réponse
+0
moins plus
Merçi, c'est excellent !
Ajouter un commentaire
Réponse
+0
moins plus
J'ai unue problème :
<unistd.h> n'est pas connue en Visual C++ 2005 ( implementation VISUAL STUDIO 2005 STANDARD EDITION ).
Ainsi, la secuence :

extern "C"{
#include <unistd.h>
}
#include <iostream>

int main(){
unsigned tmax = 2;
std::cout << "j'attends " << tmax << " secondes" << std::endl;
sleep(tmax);
std::cout << tmax << "s écoulées" << std::endl;
return 0;
}

ne marche pas.
Qu'on peut faire pour utiliser "sleep(tmax)" de la sequence ?
Ajouter un commentaire
Réponse
+0
moins plus
Ah désolée, ça je sais pas. Trois solutions possibles :

1) Il faut trouver le header équivalent mais a priori c'est un header standard. Pour celà il faut lire la doc deVisual (et sur ce coup, n'ayant pas visual, je ne vais pas pouvoir t'aider).

2) Installe cygwin, ce qui te permettra d'avoir l'équivalent d'un environnement linux sous windows. Pour le coup ce header existera si tu compiles avec g++.
http://www.cygwin.com/

3) Autre possibilité, peut être la plus simple, utilise dev cpp à la place de visual C++, et je pense que ça marchera directement.
http://www.bloodshed.net/devcpp.html

Bonne chance
Ajouter un commentaire
Réponse
+0
moins plus
void Wait(double WaitTime)
{
double fTime,LastTime;

QueryPerformanceCounter(&TimeCur);
LastTime = (float)((double)(TimeCur.QuadPart-TimeStart.QuadPart)/(double)TimerFreq.QuadPart);
do
{
QueryPerformanceCounter(&TimeCur);
fTime = (float)((double)(TimeCur.QuadPart-TimeStart.QuadPart)/(double)TimerFreq.QuadPart);
}while(fTime-LastTime < WaitTime);
LastTime = fTime;
}
Ajouter un commentaire
Ce document intitulé « fonction Wait en C++ » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook