Avatar billede brixz Nybegynder
11. september 2003 - 22:02 Der er 24 kommentarer og
1 løsning

Genopfriskning af time

Nu hvor jeg har en kode der viser lokal-tid ville jeg gerne have den til at blive ved med at tælle i samme projekt mens jeg kører resten af programmet. Kan dette lade sig gøre?

---source koden---
#include <stdio.h>
#include <dos.h>
#include <conio.h>
int main()
{
    clrscr();
    struct date date;
    struct time time;

    getdate(&date);
    gettime(&time);

    printf("Today is %02d/%02d/%d, it's %02d:%02d:%02d",
    date.da_mon,
    date.da_day,
    date.da_year,
    time.ti_hour,
    time.ti_min,
    time.ti_sec);
    getch();
    return 0;
}

Jeg havde tænkt mig at placere denne oppe i venstre hjørne via "gotoxy" og så skulle den gerne fortsætte med at tælle sekunder-minuter-timer..... mens jeg kører resten af mit program.
Avatar billede brixz Nybegynder
11. september 2003 - 22:08 #1
Er det til at forstå hvad det er jeg er ude efter?
Avatar billede arne_v Ekspert
11. september 2003 - 22:22 #2
Ja.

Selve opdateringen er simpel. Det er bare en for løkke der skriver og sover.

Problemet er at få dit program til at køre videre samtidigt. Det er
straks mere komplekst.

Hvis du kører på Windows kan du starte en tråd.

Men vi kommer altså hutigt ud i noget langhåret.
Avatar billede brixz Nybegynder
11. september 2003 - 22:26 #3
hmm det er vist også ved at være sent nu, måske jeg skulle fortsætte i morgen?
godnat for nu ;)
Avatar billede brixz Nybegynder
11. september 2003 - 22:36 #4
og lige en lille godnat note:
Ja jeg kører med win98 på de maskiner hvorpå programmet skal afvikles.
Avatar billede arne_v Ekspert
11. september 2003 - 23:54 #5
Win32 har en funktion CreateThread som kan starte en tråd.

Det er ikke så svært.

Men CreateThread og gotoxy passer ikke godt sammen. Det første er
en Win32 (console) app. Det andet er gammel DOS kode som tilfældigvis
supporteres endnu.
Avatar billede arne_v Ekspert
27. september 2003 - 13:41 #6
Kommet videre ?
Avatar billede brixz Nybegynder
28. september 2003 - 12:31 #7
nej jeg har givet op
du kan bare svare, så får du points ;)
Avatar billede arne_v Ekspert
28. september 2003 - 13:16 #8
OK
Avatar billede arne_v Ekspert
28. september 2003 - 14:21 #9
Her er et sjovt lille eksempel:

#include <time.h>

#include <windows.h>

#include <conio.h>

#include <iostream>

using namespace std;

CRITICAL_SECTION cs;

void loop1()
{
  char c[] = { '|', '/', '-', '\\', '|', '/', '-', '\\' };
  int i = 0;
  while(true)
  {
      EnterCriticalSection(&cs); 
      gotoxy(40,10);
      cout << c[i % 8];
      cout.flush();
      LeaveCriticalSection(&cs); 
      Sleep(1000);
      i++;
  }
}

void loop2()
{
  while(true)
  {
      EnterCriticalSection(&cs); 
      gotoxy(30,1);
      time_t t = time(NULL);
      cout << ctime(&t);
      cout.flush();
      LeaveCriticalSection(&cs); 
      Sleep(1000);
  }
}

DWORD __stdcall loop1dispatch(void *p)
{
  loop1();
  return 0;
}

DWORD __stdcall loop2dispatch(void *p)
{
  loop2();
  return 0;
}

void threadloop1()
{
  DWORD id;
  CreateThread(NULL,0,loop1dispatch,NULL,0,&id);
}

void threadloop2()
{
  DWORD id;
  CreateThread(NULL,0,loop2dispatch,NULL,0,&id);
}

int main()
{
  InitializeCriticalSection(&cs); 
  clrscr(),
  threadloop2();
  loop1();
  return 0;
}
Avatar billede arne_v Ekspert
28. september 2003 - 14:22 #10
Så kan andre der har lyst lege med det.

Det er som dsagt er forfærdelit misk mask af Borland specifikke DOS
compatible kald (clrscr og gotoxy), standard C++ io (cout) og
Win32 API (thread stuff).
Avatar billede brixz Nybegynder
28. september 2003 - 14:42 #11
using namespace std;

forstår ikke?
får en million fejl når jeg compiler
desuden har du glemt ".h" på <iostream>

//brixz
Avatar billede brixz Nybegynder
28. september 2003 - 14:43 #12
arne_v:

hvilken compiler bruger du egentlig?
Avatar billede arne_v Ekspert
28. september 2003 - 14:45 #13
Jeg har ikke glemt .h på iostream.

Nyere ANSI C++ compilere:

#include <iostream>

using namespace std;

Ældre C++ compilere:

#include <iostream.h>
Avatar billede arne_v Ekspert
28. september 2003 - 14:46 #14
Borland C++ 5.5 for Win32

(og som jeg har forsøgt at antyde så er clrscr og gotoxy ikke standard(
Avatar billede arne_v Ekspert
28. september 2003 - 14:47 #15
Ja - jeg bruger mange forskellige compilere - men jeg har brugt Borland til det
her kode.
Avatar billede brixz Nybegynder
28. september 2003 - 14:53 #16
ikke standart?

Men gotoxy og clrscr er da standart i C programmering
måske ikke i C++
Avatar billede arne_v Ekspert
28. september 2003 - 14:54 #17
Nej - de er heller ikke en del af ANSI C.
Avatar billede arne_v Ekspert
28. september 2003 - 14:55 #18
Men jeg prøver lige at se om jeg an lave en ren Win32 API udgave.
Avatar billede brixz Nybegynder
28. september 2003 - 14:58 #19
men det vil kun have inflydelse hvis du prøver at bruge dem på andre styresystemer end windows ikke sandt?
Avatar billede brixz Nybegynder
28. september 2003 - 15:00 #20
Jeg bruger en compiler der hedder:
Borland Turbo C++ version 3.0

Det er den eneste jeg har kunne få til at virke.
Avatar billede arne_v Ekspert
28. september 2003 - 15:02 #21
Den her bør køre på de fleste Win32 compilere (testet på BC++ 5.5, MS VC++ 6.0
og GCC 3.1):

#include <time.h>
#include <stdlib.h>
#include <string.h>

#include <windows.h>

CRITICAL_SECTION cs;
HANDLE console;

void gotoxy(int x,int y)
{
  COORD pos;
  pos.X = x;
  pos.Y = y;
  SetConsoleCursorPosition(console, pos);
}

void loop1()
{
  char c[] = { '|', '/', '-', '\\', '|', '/', '-', '\\' };
  int i = 0;
  while(true)
  {
      EnterCriticalSection(&cs); 
      gotoxy(40,10);
      DWORD dummy;
      WriteConsole(console, &c[i % 8], 1, &dummy, NULL);
      LeaveCriticalSection(&cs); 
      Sleep(1000);
      i++;
  }
}

void loop2()
{
  while(true)
  {
      EnterCriticalSection(&cs); 
      gotoxy(30,1);
      time_t t = time(NULL);
      DWORD dummy;
      char *s = ctime(&t);
      WriteConsole(console, s, strlen(s), &dummy, NULL);
      LeaveCriticalSection(&cs); 
      Sleep(1000);
  }
}

DWORD __stdcall loop1dispatch(void *p)
{
  loop1();
  return 0;
}

DWORD __stdcall loop2dispatch(void *p)
{
  loop2();
  return 0;
}

void threadloop1()
{
  DWORD id;
  CreateThread(NULL,0,loop1dispatch,NULL,0,&id);
}

void threadloop2()
{
  DWORD id;
  CreateThread(NULL,0,loop2dispatch,NULL,0,&id);
}

int main()
{
  system("CLS");
  console = GetStdHandle(STD_OUTPUT_HANDLE);
  InitializeCriticalSection(&cs); 
  threadloop2();
  loop1();
  return 0;
}
Avatar billede brixz Nybegynder
28. september 2003 - 15:02 #22
og der kan jeg også bruge alle de bøger der er skrevet om c/c++ da man ikke skal over til alt det der using namespace noget.

Jeg kan ikke forstår at man ikke beholder det gamle system.
du taster ganske enkelt mindre ved at skrive <iostream.h> uden at bruge "using namespace"
Avatar billede arne_v Ekspert
28. september 2003 - 15:02 #23
TC++ er en 16 bit comiler mener jeg og kan derfor ikke bruge CreateThread.
Avatar billede arne_v Ekspert
28. september 2003 - 15:03 #24
BC++ 5.5 comiler (altså uden IDE) kan hentes her:

http://www.borland.com/products/downloads/download_cbuilder.html
Avatar billede arne_v Ekspert
28. september 2003 - 15:05 #25
Altså jeg forstår heller ikke helt hvorfor ANSI valgte som de gjorde.

Men ...
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