Tempo C sous DOS en miliseconde?

Résolu
pcman5 Messages postés 132 Date d'inscription mercredi 12 juin 2002 Statut Membre Dernière intervention 26 janvier 2006 - 22 janv. 2006 à 22:15
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 - 27 janv. 2006 à 08:21
Voila, j'utilise le compilateur QuickC sous DOS et je cherche a faire une temporisation en miliseconde.
La fonction Sleep n'existant pas. (En tous cas elle n'est pas declarer dans time.h)

J'ai essayé la fonction suivante, elle me permet une temporisation, mais elle arondie le temp a la seconde, par exemple:
sleep(10) <=> 0ms
sleep(1200) <=> 1sec

void sleep(int time_ms)
{
float depart, courant;
_bios_timeofday(_TIME_GETCLOCK, &depart);
do
{
_bios_timeofday(_TIME_GETCLOCK, &courant);
}
while ( (courant - depart) <= ((float)(time_ms/1000)*(float)18.2) );
}

cette fonction est l'exemple fournit dans la documentation de la run-time microsoft, pour la fonction _bios_timeofday.

voila ou j'en suis, donc je cherche une fonction qui me permeterai une tempo avec une presision de l'ordre de la milliseconde.

Merci d'avance PCMAN5

12 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
27 janv. 2006 à 08:21
Salut! Tu peux économiser des instructions en calculant la date de fin et ensuite la boucle:

while(datefin>time){};

return;
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
22 janv. 2006 à 22:35
Sleep est dans stdlib.h

if(!Meilleur("Joky")) return ERREUR;<
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
23 janv. 2006 à 13:25
attention a la fonction sleep. J'ai déjà eu de belle surprises avec. La tempo me renvoyait un résultat en fonction de la puissance du PC utilisé ! Pour dire, pour une tempo de 500 ms, j'avais des résultats variants en gros entre 500 ms et 2s !

Personnellement, pour une tempo précise et fiable, j'utilise une clock ! Je ne sais pas ce que vous en pensez ?

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
23 janv. 2006 à 14:24
Clock = gettickcount

(et linux > windoz)
0

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

Posez votre question
vangeurmasker Messages postés 99 Date d'inscription mercredi 12 mai 2004 Statut Membre Dernière intervention 29 mars 2006
23 janv. 2006 à 17:37
Sleep précise le temps de pause minimum.

Sur un systeme multitache Sleep(1000) arrete le processus pendant 1
seconde puis remet le processus dans la liste d'atente. Si le
processeur a autre chose à faire la pause peut durer plus.

Mais de toute façon sur un systeme multitache le systeme peut donner le
processeur a un autre programme a tout moment donc même avec la
fonction clock on ne peut pas faire un pause précise a la milliseconde
a tous les coups.
0
pcman5 Messages postés 132 Date d'inscription mercredi 12 juin 2002 Statut Membre Dernière intervention 26 janvier 2006
23 janv. 2006 à 18:51
ok merci bien. j'avais lus je ne sait plus ou que sleep ce trouvait dans TIME.H, mais c'est nimp.
0
pcman5 Messages postés 132 Date d'inscription mercredi 12 juin 2002 Statut Membre Dernière intervention 26 janvier 2006
23 janv. 2006 à 19:00
hum en faite, je me suis trompé, sleep n'est pas non plus dans stdlib.h.
mais la fonction sleep n'est pas repertorier dans la run-time, donc je suppose qu'elle n'existe pas sous DOS ???
Peut faut-il realiser cette fonction en assembleur, avec les interruption du DOS ou du BIOS?

PCMAN5
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
23 janv. 2006 à 19:04
C'est Sleep() avec une majuscule.

if(!Meilleur("Joky")) return ERREUR;<
0
pcman5 Messages postés 132 Date d'inscription mercredi 12 juin 2002 Statut Membre Dernière intervention 26 janvier 2006
25 janv. 2006 à 18:56
oui, meme si je l'ai mal ecrit, je sais bien qu'il ya une majuscule, mais voici mon stdlib:
<hr size="2" width="100%">
/***
*stdlib.h - d‚clarations et d‚finitions des fonctions de bibliothŠque
* fr‚quemment utilis‚es.
*
* Copyright (c) 1985-1988, Microsoft Corporation. Tous droits r‚serv‚s.
*
*Objetÿ:
* Ce fichier inclus contient les d‚clarations de fonction pour les
* fonctions de bibliothŠque fr‚quemment utilis‚es qui soit n'entrent
* dans aucune autre cat‚gorie, ou qui, comme toupper/tolower, ne
* peuvent ˆtre d‚clar‚es … l'endroit habituel pour d'autres raisons.
* [ANSI]
*
****/

#ifndef _SIZE_T_DEFINED
typedef unsigned int size_t;
#define _SIZE_T_DEFINED
#endif

#ifndef NO_EXT_KEYS /* extensions activ‚es */
#define _CDECL cdecl
#define _NEAR near
#else /* extensions d‚sactiv‚es */
#define _CDECL
#define _NEAR
#endif /* NO_EXT_KEYS */

/* d‚finition du type de retour pour la fonction onexit() */

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

#ifndef _ONEXIT_T_DEFINED
typedef int (_CDECL * _CDECL onexit_t)();
#define _ONEXIT_T_DEFINED
#endif

/* D‚finitions des structures de donn‚es pour div et ldiv. */

#ifndef _DIV_T_DEFINED

typedef struct {
int quot;
int rem;
} div_t;

typedef struct {
long quot;
long rem;
} ldiv_t;

#define _DIV_T_DEFINED
#endif

/* Valeur maximale pouvant ˆtre retourn‚e par rand. */

#define RAND_MAX 0x7fff

/* macros min et max */

#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))

/* tailles des tampons utilis‚s par les fonctions _makepath() et _splitpath().
* les tailles comprennent un espace pour le caractŠre de terminaison 0
*/

#define _MAX_PATH 144 /* longueur maximale du nom de chemin complet */
#define _MAX_DRIVE 3 /* longueur maximale du composant du lecteur */
#define _MAX_DIR 130 /* longueur maximale du composant du chemin */
#define _MAX_FNAME 9 /* longueur maximale du composant du nom de fichier */
#define _MAX_EXT 5 /* longueur maximale du composant de l'extension */

/* d‚clarations des variables externes */

extern int _NEAR _CDECL errno; /* nombre d'erreur de style XENIX */
extern int _NEAR _CDECL _doserrno; /* valeur d'erreur de systŠme MS-DOS */
extern char * _NEAR _CDECL sys_errlist[]; /* tableau de message d'erreur perror */
extern int _NEAR _CDECL sys_nerr; /* nombre d'entr‚es dans le tableau sys_errlist table */

extern char ** _NEAR _CDECL environ; /* pointeur de tableau d'environnement */

extern unsigned int _NEAR _CDECL _psp; /* pr‚fixe de segment du programme */

extern int _NEAR _CDECL _fmode; /* mode de traduction du fichier par d‚faut */

/* nombres des versions DOS majeure/mineure */

extern unsigned char _NEAR _CDECL _osmajor;
extern unsigned char _NEAR _CDECL _osminor;

#define DOS_MODE 0 /* Mode d'adresse r‚elle */
#define OS2_MODE 1 /* Mode d'adresse prot‚g‚e */

extern unsigned char _NEAR _CDECL _osmode;

/* prototypes de fonctions */

double _CDECL atof(const char *);
double _CDECL strtod(const char *, char * *);
ldiv_t _CDECL ldiv(long, long);

void _CDECL abort(void);
int _CDECL abs(int);
int _CDECL atexit(void (_CDECL *)(void));
int _CDECL atoi(const char *);
long _CDECL atol(const char *);
void * _CDECL bsearch(const void *, const void *, size_t, size_t, int (_CDECL *)(const void *, const void *));
void * _CDECL calloc(size_t, size_t);
div_t _CDECL div(int, int);
char * _CDECL ecvt(double, int, int *, int *);
void _CDECL exit(int);
void _CDECL _exit(int);
char * _CDECL fcvt(double, int, int *, int *);
void _CDECL free(void *);
char * _CDECL gcvt(double, int, char *);
char * _CDECL getenv(const char *);
char * _CDECL itoa(int, char *, int);
long _CDECL labs(long);
unsigned long _CDECL _lrotl(unsigned long, int);
unsigned long _CDECL _lrotr(unsigned long, int);
char * _CDECL ltoa(long, char *, int);
void _CDECL _makepath(char *, char *, char *, char *, char *);
void * _CDECL malloc(size_t);
onexit_t _CDECL onexit(onexit_t);
void _CDECL perror(const char *);
int _CDECL putenv(char *);
void _CDECL qsort(void *, size_t, size_t, int (_CDECL *)(const void *, const void *));
unsigned int _CDECL _rotl(unsigned int, int);
unsigned int _CDECL _rotr(unsigned int, int);
int _CDECL rand(void);
void * _CDECL realloc(void *, size_t);
void _CDECL _searchenv(char *, char *, char *);
void _CDECL _splitpath(char *, char *, char *, char *, char *);
void _CDECL srand(unsigned int);
long _CDECL strtol(const char *, char * *, int);
unsigned long _CDECL strtoul(const char *, char * *, int);
void _CDECL swab(char *, char *, int);
int _CDECL system(const char *);
char * _CDECL ultoa(unsigned long, char *, int);

#ifndef tolower /* tolower a ‚t‚ non d‚finie - utilise une fonction */
int _CDECL tolower(int);
#endif /* tolower */

#ifndef toupper /* toupper a ‚t‚ non d‚finie - utilise une fonction */
int _CDECL toupper(int);
#endif /* toupper */
<hr size="2" width="100%">
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
25 janv. 2006 à 23:47
Je vien de me rendre compte que je ne trouve pas sleep() dans ma bibloothèque de fonctions standard du C. Est-elle compatible avec les normes ANSI ? Ce qui pourrait expliquer que tu ne les trouves pas si ton compilateur s'y conforme !

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
26 janv. 2006 à 06:12
Merci de ne pas poster le contenu de kernel32.lib!
0
pcman5 Messages postés 132 Date d'inscription mercredi 12 juin 2002 Statut Membre Dernière intervention 26 janvier 2006
26 janv. 2006 à 20:58
C'est bon j'ai trouver une solution.
Je suis désoler pour le listing du stdlib.h, j'aurais dû éviter, mais on ne me croyait pas...
Pour ceux a qui ca interesse j'ai utilisée l'interruption 21 n°0x2C, qui retourne la date du systeme,
voici donc le source:
<hr size= "2" width="100%">#include <dos.h>
union REGS in,out;

void Sleep(int time)
{
int debut, encour, ecouler;

in.h.ah =0x2C; /* Appel de l'int 21 pour en recuperer l'heur systeme actuel */
int86(0x21,&in,&out);
debut = out.h.cl*60000 + out.h.dh*1000 + out.h.dl*10; /* convertion en miliseconde */

do
{
rin.h.ah = 0x2C;
int86(0x21,&in,&out);
encour = out.h.cl*60000 + out.h.dh*1000 + out.h.dl*10;
ecouler = encour-debut; /* Calcule du temp total ecouler */
} while (ecouler<time); /* Si le temp ecoulé est plus petit que le temp demandé on boucle */
}
<hr size ="2" width="100%">Peut etre qu'il serai préferable d'utiliser une interruption BIOS... mais bon.
0
Rejoignez-nous