Avatar billede appel Novice
07. december 2001 - 19:56 Der er 1 løsning

timerinterrrupt i c program under dos

hejsa,

Hvordan sætter man et interrupt eller en timer op så der bliver kørt en bestemt funktion inden for et bestemt tidsinterval?

Det skal pointeres at programmet kører under DOS.

På forhånd tak
Avatar billede soepro Nybegynder
11. december 2001 - 10:22 #1
Denne laver et lille ur i nederste højre hjørne. Du trykker blot ESC eller \'EXIT\' på det nye prompt for at stoppe uret:

#include <stdlib.h>
#include <conio.h>
#include <dos.h>

/* The clock tick interrupt */
#define INTR 0X1C
struct  time curTim;
int    timX, timY;
int    oldX, oldY;
char    curTimStr[16]; // TT:MM:SS + attributter.
void    interrupt ( *oldtimertick)(...);

/* -------------------------- HOVED PROGRAM ----------------------- */
void interrupt timertick(...)
{
  disable();

  /* S† hent nuv. tid - og smid det ud p† skr‘men. */
  gettime(&curTim);
  /*
  curTimStr[0]  = \'0\' + curTim.ti_hour / 10;
  curTimStr[2]  = \'0\' + curTim.ti_hour % 10;
  curTimStr[6]  = \'0\' + curTim.ti_min  / 10;
  curTimStr[8]  = \'0\' + curTim.ti_min  % 10;
  curTimStr[12] = \'0\' + curTim.ti_sec  / 10;
  curTimStr[14] = \'0\' + curTim.ti_sec  % 10;
  puttext(timX, timY, timX+8, timY, &curTimStr);
  */
  oldX = wherex(); oldY = wherey();
  gotoxy(timX, timY);
  cprintf(\"%0d:%0d:%0d\", curTim.ti_hour, curTim.ti_min, curTim.ti_sec);
  gotoxy(oldX, oldY);

  oldtimertick();
  enable();
  return;
} // timertick

int main(int argc, char* argv[])
{
  /* Initier egne variable. (Forventer op til 2 params - men ingen er OK. */
  if (argc < 2 || (timX = atoi(argv[1])) < 1 || timX > 72)
    timX = 72;
  if (argc < 3 || (timY = atoi(argv[2])) < 1 || timY > 24)
    timY = 24;
  gettext(timX, timY, timX+8, timY, &curTimStr);
  curTimStr[4] = curTimStr[10] = \':\';
  oldtimertick = getvect(INTR);

  /* Flyt timer tick til egen rutine - og start ny DOS skal. Hvis brugeren */
  /* skriver \'exit\' afsluttes den, og dermed forsvinder ogs† uret.        */
  setvect(INTR, timertick);

  clrscr();
  cprintf(\"Ur k›rer i position (X,Y) = (%d,%d)\\r\\n\", timX, timY);
  cputs(\"Tryk p† en tast for at starte DOS - ESC for at afbryde.\");
  if (getch() != 0x1B)
    system(getenv(\"COMSPEC\"));

  /* S‘t timer tick tilbage til gamle handler - og afslut dette program. */
  setvect(INTR, oldtimertick);
  return 0;
} // MAIN
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester