Sleep non bloquant

ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004 - 13 déc. 2004 à 12:48
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004 - 14 déc. 2004 à 16:25
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

cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
13 déc. 2004 à 13:26
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..."
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 déc. 2004 à 13:31
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?
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
13 déc. 2004 à 16:49
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
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
13 déc. 2004 à 16:58
sinon est ce qu il est possible de faire des sleep de l autre de la milliseconde ?
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
13 déc. 2004 à 17:21
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++
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 déc. 2004 à 18:51
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.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 déc. 2004 à 19:26
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.
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
13 déc. 2004 à 21:26
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 ? ;)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 déc. 2004 à 23:31
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.
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 06:42
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
14 déc. 2004 à 09:01
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;
}
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 déc. 2004 à 12:03
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é?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 déc. 2004 à 12:31
Et si tu mets l'envoi des codes touches à ton automate dans la fonction main, ça ne marcherait pas?
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 16:25
je vais essayer je te dirais si ca fonctionne

en tout cas merci ;)
0
Rejoignez-nous