Sleep non bloquant

Signaler
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004
-
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004
-
Je realise un programme qui deroute les interruptions 1Ch et 09h , mais une fois qu elles sont deroutees je voudrais que mon programme attende un certain temps tout en laissant les interruptions libre d execution , , alors j ai mis un sleep , mais le probleme c est que les interruptions ne s executent pas pendant le sleep , donc je voulais savoir si il existait un sleep non bloquant ou un equivalent.

Merci d avance.

14 réponses

Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
tu fias un sleep dans ton programme et dans un thread, tu "fais" se derouler tes interruptions...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Normalement, on ne peut pas accéder aux interruptions sous Windows. Tu es sûr que tes interruptions fonctionnaient avant l'utilisation de Sleep() ? Si oui, comment tu as fait et sous quel Windows?
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

en fait tu peut utiliser les interruptions sous n importe quel windows mais il faut utiliser Borland c++

par contre j ai pour contrainte de ne pas utiliser de thread

j ai trouve un exemple de code pour un sleep non bloquant en assembleur mais je ne sais pas comment on l insert en borland
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

sinon est ce qu il est possible de faire des sleep de l autre de la milliseconde ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Quel rapport entre la marque de compilo et l'acces aux interruptions, ne serait pas plutot de coder en 16 bits ton affaire ???
Dans tous les cas tu n'auras acces qu'aux interruptions auxquelles le systeme te laissera acceder et rien d'autre, aucun acces direct aux periphs comme disque etc...
C'est une methode de prog a releguer dans les musees.

ciao...
BruNews, MVP VC++
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Plutot que d'essayer de dérouter des interruptions (méthodes préhistoriques, valables uniquement en mode 16 bits -> DOS, anciens windows et encore), dis-nous ce que tu veux faire, on pourra peut-être te donner une solution plus "moderne" pour ton problème.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Une simple boucle ne peut pas résoudre ton problème?
C'est ce que je faisais pour faire attendre un programme en MS-DOS puisque le problème des ressources ne se posait pas à l'époque.
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

le but de mon application est de declencher toute les secondes un automate deterministe a etat grace a l interruption horloge et d envoyer directement les touches appuyees a l automate comme entrees, cela marche parfaitement mais mon probleme c est qu il faut que je donne quelque chose a faire dans le main pour eviter que mon programme ne se termine , j ai donc mis une boucle , mais il faut que je mette des temps de pause sinon j ai tout le processeur qui tourne pour cette boucle et ca empeche mes interuptions de se declencher , donc c est pour ca que j ai mit un sleep mais du coup mes interuptions ne peuvent etre prises en compte que toutes les secondes puisque mon programme est gele pendant le sleep , donc je voulais savoir si il existait un sleep non bloquant pour les interuptions ou si il existait un sleep qui me permet de geler mon prog pendant 1ms.

c ets simple non ? ;)
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Si je me trompe dis-le-moi stp. Ton programme déroute les interruptions 1Ch et 09h en faisant pointer leurs vercteurs vers tes deux fonctions. La première déclenche ton automate toutes les secondes. La deuxième lui envoit le code des touches appuyées. Ton main n'a donc plus rien à faire et se termine. C'est vrai qu'une boucle ça occupe trop le processeur. Et si tu fais un getch() ou getchar() dans ton main? Tant qu'une touche spécifique n'est pas appuyée ton programme restera en attente et n'empechera pas tes interruptions de tourner je pense:
while(1)
{
int touche=getch();
if (touche==27) return; // appui sur ECHAP
}
Je pense que si tes deux fonctions sont dans des modules autonomes le problème ne se posera pas.
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

c est exactement ca que fais mon programme , mais j ai deja essaye la solution du getch mais malheureusement ca interfere avec ma fonction dans l interuption 09
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
voila une solution sans utiliser les IT.

// var globalle à mettre à FALSE pour arrêter a boucle principale

#include <windows.h>
....

int bAgain;

int main()
{

DWORD dwLast = 0;
while(bAgain)
{
// attente prochaine heure
while(GetTickCount()-dwLast < 1000)
Sleep(100);

dwlast = GetTickCount();
// récupération état des touches (les indices sont VK_..., voir MSDN)
BYTE keyState[256];
GetKeyboardState(keyState);

// appeler l'automate (qui doit mettre bAgain à FALSE pour tout stopper)
}

return 0;
}
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
C'est vrai qu'une solution moderne est préférable. Mais avant d'abandonner l'ancienne méthode, il faut toujours essayer de comprendre exactement pourquoi elle ne marchait pas. Puisque l'accès à tes interruptions a réussi, le reste ne devrait normalement pas poser de gros problèmes.
Comment getch() interfère-t-elle avec ta fontion dans l'interruption 09h? Normalement, une fonction d'interruption doit appeler la fonction de l'ancienne pour ne pas perturber le fonctionnement du système. Voici un petit exemple (non testé):
void interrupt (* ancien09h)();
void interrupt (mon09h)()
{
//....ici envoi des codes à ton automate
ancien09h();//Appel de la fonction originale
}
void main()
{
ancien09h=getvect(0x09);
setvect(0x09, &mon09h);
while(getch() != 27);
setvect(0x09, ancien09h);
return; //ou exit(0)
}

Ainsi, ça ne devrait pas interférer. Tu l'as déja essayé?
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Et si tu mets l'envoi des codes touches à ton automate dans la fonction main, ça ne marcherait pas?
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

je vais essayer je te dirais si ca fonctionne

en tout cas merci ;)