23. september 1999 - 10:02Der er
21 kommentarer og 1 løsning
"Levende" ur i C/C++
Så er der lidt arbejde til Bjarke og Soepro igen ;-))
Jeg har forsøgt på at lave et "levende" ur. Altså et som blir opdateret hvert sek. Den eneste måde jeg har fået det til at virke på er denne måde:
struct tm *time_now; time_t secs_now; char str[80]; int i, timeout; timeout = 180;
for(i = 0; i < timeout; i++)
{
delay(1000); clrscr(); tzset(); time(&secs_now); time_now = localtime(&secs_now); strftime(str, 80,"Klokken er %I:%M:%S (%Z) %A den %d %B %Y", time_now); printf("%s\n",str); gotoxy(80,25);
}
return 0;
Mit spørgsmål er så; kan man ikke lave det så man ikke skal "slette skærmen" hele tiden. Altså uden clrscr() så man f.eks. kan ha' det til at køre et sted på skærmen og så stadig skrive et andet sted ???
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Kender ikke c++ kommandoen til det, men hvis du placerer cursoren samme sted hver gang, ex. øverst på skærmen, midt for - og så laver din print-sætning der. Så bliver der jo hele tiden skrevet oveni det samme...
Men at returnere kontrollen til DOS og stadig køre videre - det er vist de 2 andre : )
Det du efterlyser er mere et program som kan ligge i baggrunden og vise tiden på skærmen (samme sted på skærmen - som lrj har beskrevet). Dette program skal efter det er blevet executed 'overgive' kontrollen tilbage til DOS. Dette gøres via et TSR (Terminate and Stay Resident) program.
God arbejdslyst
(spørg KLA hvis du vil vide noget om ASM prg ;-) ... )
tknudsen >> kører uret så stadig (med skærmopdatering)!
snowball >> som du kan se i de andre spørgsmål, så har jeg selv spurgt lidt til det med ure. Soepro har lagt koden til et interrupt-styret ur under et andet spørgsmål her på siden.
Den primitive løsning jeg selv har brugt og er blevet træt af (men det virker) er i princippet:
void opdater_ur() { int x=wherex(), y=wherey(); // gettime ... gotoxy(1,72); // skriv tiden gotoxy(x,y); // sæt cursoren hvor den stod før }
void main() { do { // med kbhit() undgår du at uret står stille, når du kalder getch() funktionen if(kbhit()) tast=getch(); // brug tast til noget // udfør noget andet opdater_ur(); } while(tast!=27); }
Fidusen er at sørge for at opdateringen af uret hele tiden kaldes i en løkke, men det er irriterende, når man skal indlæse (du kommer til at bruge kbhit() temmelig meget)!
Mht. til at lave et interrupt-styret ur eller et TSR program, så melder jeg pas:-( Men se evt soepro's ur andetsteds.
bjarke >> Ja - det er jo netop pointen med TSR - så længe vi snakker DOS programmering that is.
Snowball >> Jeg har muligvis misforstået dit spørgsmål (happens all the time). Du vil lave et C prg hvori du vil vise uret ? Hvis ja - så glem det med TSR programmet og se bjarkes eksempel - det vil virke !
tknudsen >> Hvorfor dur det ikke med TSR. Hvis nu en eller anden skrap gut her på eksperten laver programmet? Findes der ikke også funktioner til at lade c-programmer stay resident?
bjarke >> det vil også virke med et TSR program - det er bare ikke nødvendig hvis det er det samme program.
Det fundamentale her (og i det musse styring vi har snakket om) er hvorvidt der ønskes at lave noget a la event styret i windows. Dette kan gøres via software interrupts.
HW timeren udløser et sw interrupt som feks et TSR prg kunne reagere på og udskrive klokken på skærmen. Dette vil så ske uanset hvilket andet program du har startet i DOS - TSR prg vil skrive det samme sted på skærmen og om nødvendig overskrive andet der står på samme koordinater.
Hvis ikke denne 'event' styring ønskes/er nødvendig kan man i hver enkelt program selv hente tiden/musse pos/kbhit i en-eller-anden løkke.
Man kan godt lave TSR programmer i C - jeg ved bare ikke lige hvordan (med mindre der benyttes in-line asm)
tknudsen >> Kunne main ikke lave et TSR i c efter følgende princip:
void main(int argc, char* argv[]) { int x=(int)argv[1]; // +'0' ? int y=(int)argv[2]; // gettime ... gotoxy(x,y); // skriv tiden på skærmen // stay/go resident }
Og så kunne man bare kalde dette program med passende argumenter fra diverse programmer (hvor man så, selvfølgelig er nødt til at resservere en fast skærmplads til uret).
bjarke >> eh - jow eeh - selve program designet er der i kke noget i vejen med - der er bare nogle få ting der skal på: 1) for at programmet overhovedet kører 'af sig selv' skal main offset'et mappes ned i interrupt vector tabellen på hw clock interruptet. Så bliver main afviklet ca. 18.2 gange i sekundet (her kunne man jo lave en neddelingen så det kun sker 2-4/sek.) Dette gøres med int21h func 25h. hw clock ligger på int1Ch.
2)programmet skal afsluttes med int21h func31h. Dette afvikler programmet og ligger det op i den residente del af mem.
3)før gotoxy skal x,y lige gemmes så der kan flyttes tilbage til de oprindelige koordinater
- her er nogle eksempler i asm... mov dx,offset Main ;put main offset to HW clock int (1Ch) - segment mov ax,251ch ;is know due to abilities of .com file (all segs are the same) int 21h
mov dx,((prglen+15)/16)+10h ;length of prg (within _TEXT) in paragraphs (16 bytes) mov ax,3100h ; add 16 to tage højde for heltalsdivision :-) int 21h
bjarke >> jeg har lavet det 'ur' vi snakker om, men det er kodet i assembler !
Jeg har ikke prøvet at lave noget tilsvarende i C, men jeg sender lige asm koden til dig så du kan se hvad det drejer sig om ! Det minder lidt om det prg vi har snakket om ang musse styring (gentager jeg mig selv - I dont know - er lige vågnet - en laang nat venter :). Jeg har vist din email adr ellers skriver jeg lige igen. Hvis du har spørgsmål 'uret' så spørg...
For lige at komme tilbage til et spor hvor jeg også kan være lidt med ;-))
Hvis man laver lidt om på den kode som jeg postede i starten, så løkken bli'r til en uendelige løkke ( for(;;) ) hvordan laver så så den stopper hvis man f.eks. trykker på ESC eller ENTER ? Skal der smides en BREAK; ind et eller andet sted ???
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.