/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
[Newbie] Stopurs-problematik
Fra : nkh


Dato : 24-05-05 22:33

Hej gruppe

Jeg er helt ny til c, og har på det sidste mest af alt programmeret php
på et relativt simpelt niveau, men i de glade ungdomsskoledage for 9-10
år siden fik den da også lidt pascal, men da jeg har glemt det meste af
syntaksen, tænkte jeg at jeg ligeså godt kunne komme igang med c, da det
virker som det mest udbredte (især inden for linux, som jeg nu bruger)..
Jeg kunne godt tænke mig at lave et program, hvor en nedtællingstimer
bliver vist på skærmen sideløbende med at programmet kører.

For at holde dette simpelt, vil jeg forsøge at lave et "stopursprogram",
hvor timeren kører, og man kan pause timeren, fortsætte og resette den.
Jeg kan godt lave en timer der tæller ned (gennem while-løkker og
sleep), ligesom at jeg godt kan lave getchar-input, jeg kan bare ikke
køre disse samtidigt.

Hvad er tanken bag stopursprogrammet? Er det en del mere avanceret end
begynderniveau?

Jeg har lavet en masse begynder programmer (HelloWorld, fibonacci og
tegn-et-juletræ-med-stjerner), men vil gerne videre.

Link til læsestof bliver værdsat!

På forhånd tak,
Niels

PS: Jeg håber ikke at mit niveau er for lavt til gruppen - jeg vil gerne
lære, men behøver nok lige lidt hjælp for at komme igang.



 
 
Niels Martin Hansen (24-05-2005)
Kommentar
Fra : Niels Martin Hansen


Dato : 24-05-05 23:43

nkh wrote:
> For at holde dette simpelt, vil jeg forsøge at lave et "stopursprogram",
> hvor timeren kører, og man kan pause timeren, fortsætte og resette den.
> Jeg kan godt lave en timer der tæller ned (gennem while-løkker og
> sleep), ligesom at jeg godt kan lave getchar-input, jeg kan bare ikke
> køre disse samtidigt.

Hvis du vil køre en funktion med et bestemt interval på Linux eller
andet Unix-lignende systemer, så er der normalt to måder. Enten kan man
benytte sig af SIGALRM signalet, eller man kan lave en slags multithreading.

> Hvad er tanken bag stopursprogrammet? Er det en del mere avanceret end
> begynderniveau?

Multithreading kan have en del implikationer, idet man skal tænke på
hvad der sker hvis to tråde prøver at tilgå de samme data "samtidig",
men i og for sig kan de problemer også sagtens opstå når man benytter
sig af signaler. Signaler kræver dog normalt en hel del mindre arbejde
fra programmørens sde.

> Jeg har lavet en masse begynder programmer (HelloWorld, fibonacci og
> tegn-et-juletræ-med-stjerner), men vil gerne videre.
>
> Link til læsestof bliver værdsat!

Prøv man-siderne! I et terminalvindue skriv:

$ man signal

Du kan slå de fleste funktioner i C standardbiblioteket op på den måde.
Her et et lille eksempel frit fra hukommelsen:

#include <signal.h>
#include <stdio.h>

void signalhandler(int signum)
{
   printf("alarm!");
}

int main(void)
{
signal(SIGALRM, signalhandler);
printf("saetter alarm om 2 sekunder");
alarm(2);
pause();
return 0;
}

/Niels

Kent Friis (25-05-2005)
Kommentar
Fra : Kent Friis


Dato : 25-05-05 16:12

Den Wed, 25 May 2005 00:43:09 +0200 skrev Niels Martin Hansen:
> nkh wrote:
>> For at holde dette simpelt, vil jeg forsøge at lave et "stopursprogram",
>> hvor timeren kører, og man kan pause timeren, fortsætte og resette den.
>> Jeg kan godt lave en timer der tæller ned (gennem while-løkker og
>> sleep), ligesom at jeg godt kan lave getchar-input, jeg kan bare ikke
>> køre disse samtidigt.
>
> Hvis du vil køre en funktion med et bestemt interval på Linux eller
> andet Unix-lignende systemer, så er der normalt to måder. Enten kan man
> benytte sig af SIGALRM signalet, eller man kan lave en slags multithreading.

Eller man kan bruge select() (eller poll()) til at vente på tastaturet
i n sekunder / millisekunder ad gangen.

> Multithreading kan have en del implikationer, idet man skal tænke på
> hvad der sker hvis to tråde prøver at tilgå de samme data "samtidig",
> men i og for sig kan de problemer også sagtens opstå når man benytter
> sig af signaler.

Det sidste synes jeg er en ret vigtig detalje at få med, især når vi
snakker om en nybegynder. Jeg havde programmeret i nogle år da jeg
første gang forsøgte at bruge alarm(), og selv da tog det mig lang
tid at finde ud af hvorfor programmet crashede ind imellem.

En detalje man desuden skal være opmærksom på er at diverse
synkroniserings-systemer, mutex, semaphor osv ikke virker helt som
ved threads, da hovedprogrammet ikke kører videre før sighandler-
funktionen returnerer. Hvis hovedprogrammet allerede har låst den
kritiske region, kan sighandler-funktionen ikke blot vente på at
denne bliver frigivet, for det gør den ikke før sighandler funktionen
er færdig med sit arbejde.

Derfor vil jeg anbefale at starte med select(), eller alternativt
ncurses i halfbreak-mode, hvilket jeg dog aldrig selv fik til at
virke (halfbreak). Snakker vi om et ur nede i hjørnet imens resten af
programmet kører, er det helt klart ncurses-løsningen der bør kigges på.

(Ncurses giver mulighed for at læse et tegn ad gangen, placere cursoren
et bestemt sted på skærmen, slette skærmbilledet, farver osv).

Mvh
Kent
--
Hard work may pay off in the long run, but lazyness pays off right now.

nkh (25-05-2005)
Kommentar
Fra : nkh


Dato : 25-05-05 20:26

ons, 25 05 2005 kl. 15:12 +0000, skrev Kent Friis:
> Den Wed, 25 May 2005 00:43:09 +0200 skrev Niels Martin Hansen:
> > nkh wrote:
> >> For at holde dette simpelt, vil jeg forsøge at lave et "stopursprogram",
> >> hvor timeren kører, og man kan pause timeren, fortsætte og resette den.
> >> Jeg kan godt lave en timer der tæller ned (gennem while-løkker og
> >> sleep), ligesom at jeg godt kan lave getchar-input, jeg kan bare ikke
> >> køre disse samtidigt.
> >
> > Hvis du vil køre en funktion med et bestemt interval på Linux eller
> > andet Unix-lignende systemer, så er der normalt to måder. Enten kan man
> > benytte sig af SIGALRM signalet, eller man kan lave en slags multithreading.
>
> Eller man kan bruge select() (eller poll()) til at vente på tastaturet
> i n sekunder / millisekunder ad gangen.
>
> > Multithreading kan have en del implikationer, idet man skal tænke på
> > hvad der sker hvis to tråde prøver at tilgå de samme data "samtidig",
> > men i og for sig kan de problemer også sagtens opstå når man benytter
> > sig af signaler.
>
> Det sidste synes jeg er en ret vigtig detalje at få med, især når vi
> snakker om en nybegynder. Jeg havde programmeret i nogle år da jeg
> første gang forsøgte at bruge alarm(), og selv da tog det mig lang
> tid at finde ud af hvorfor programmet crashede ind imellem.
>
> En detalje man desuden skal være opmærksom på er at diverse
> synkroniserings-systemer, mutex, semaphor osv ikke virker helt som
> ved threads, da hovedprogrammet ikke kører videre før sighandler-
> funktionen returnerer. Hvis hovedprogrammet allerede har låst den
> kritiske region, kan sighandler-funktionen ikke blot vente på at
> denne bliver frigivet, for det gør den ikke før sighandler funktionen
> er færdig med sit arbejde.
>
> Derfor vil jeg anbefale at starte med select(), eller alternativt
> ncurses i halfbreak-mode, hvilket jeg dog aldrig selv fik til at
> virke (halfbreak). Snakker vi om et ur nede i hjørnet imens resten af
> programmet kører, er det helt klart ncurses-løsningen der bør kigges på.
>
> (Ncurses giver mulighed for at læse et tegn ad gangen, placere cursoren
> et bestemt sted på skærmen, slette skærmbilledet, farver osv).
>
> Mvh
> Kent

Tak for begge svar, umiddelbart lyder Kents forslag som det simpleste,
så det tror jeg at jeg vil sætte mine penge på - kunne dog heller ikke
få Niels' eksempel til at køre..

Har dog problemer med at bruge select og poll. Kan ikke helt lure hvilke
parametre de skal bruge. Det ville være rart hvis I havde et lille
eksempel.

Alternativt og/eller i forlængelse af foregående, kan nogen så anbefale
en god tyk referencebog, gerne fyldt med eksempler?

mvh
Niels


Michael Rasmussen (28-05-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 28-05-05 13:38

On Wed, 25 May 2005 21:26:25 +0200, nkh wrote:

>
> Alternativt og/eller i forlængelse af foregående, kan nogen så anbefale
> en god tyk referencebog, gerne fyldt med eksempler?
Den bedste referencebog jeg kender: Linux application development
(http://www.amazon.co.uk/exec/obidos/ASIN/0321219147/qid=1117283786/sr=2-1/ref=sr_2_3_1/202-5836806-6421450)
Den bedste lærebog: Understanding Unix/Linux
programminghttp://www.amazon.co.uk/exec/obidos/ASIN/0130083968/qid=1117283861/sr=1-3/ref=sr_1_2_3/202-5836806-6421450) (

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste