2013-11-19, 19:32
  #1
Medlem
Schweinsteigens avatar
Tjo!

Jag har börjat bygga ett större
program i vilket det är tänkt att
int main() ska låta användaren
efter inmatning få utföra ett antal
olika sysslor, bland annat erbjudas
root privilegier efter korrekt inmatning
av ett lösenord. Användaren kan även efter
inmatning tala om för programmet att det
ska avslutas.

Programmet ska alltså inte avslutas
automatiskt vilket leder mig fram till
min fråga:

Hur håller jag int main() levande
(på ett "bra" sätt) ?

Nu är jag inte närmare insatt men
om man tänker sig ett seriöst företag
som programmerat en Single-Purpose
mikroprocessor i C som konstant ska
hålla en tråd i exekvering antar
jag exempelvis inte är skriven
som en stor oändlig for-loop
(se nedanför).

Kod:
int main() {

  for(;;) {
   
      //Do stuff

    if( user_wanna_exit )
      return 0;
  }
}


Fler exempel på vad jag
inte antar vara optimalt.

Alltid hoppa tillbaks till början:
Kod:
int main() {

  top:
   
      //Do stuff

    if( user_wanna_exit )
      return 0;
  
  goto top;
}


Oändligt while loop:
Kod:
int main() {

  while( true ) {
   
      //Do stuff

    if( user_wanna_exit )
      return 0;
  }
}


do-while tills annat sägs:
Kod:
int main() {

  do {
   
      //Do stuff

  } while ( user_not_wanna_exit )
}


Hoppas det framgår vad jag är ute efter.
Tack på förhand!
__________________
Senast redigerad av Schweinsteigen 2013-11-19 kl. 19:34.
Citera
2013-11-19, 20:17
  #2
Medlem
bithaxs avatar
Generellt bör inte goto användas för annat än möjligen felhantering.

I övrigt känns detta som hårklyverier.

Vissa anser att användning av break i loopar är fult, och att det endast skall finnas return på ett ställe, sist i varje funktion.

Jag brukar göra det som leder till det jag anser som mest läsbart,
föredrar
Kod:
for(;;)
framför
Kod:
while(true)
, men det spelar egentligen inte så mycket roll.
Kompilatorn kommer förmodligen optimera alla looparna i TS post till samma sak ändå.
__________________
Senast redigerad av bithax 2013-11-19 kl. 20:20.
Citera
2013-11-19, 20:29
  #3
Medlem
Citat:
Ursprungligen postat av Schweinsteigen
Nu är jag inte närmare insatt men om man tänker sig ett seriöst företag som programmerat en Single-Purpose mikroprocessor i C som konstant ska hålla en tråd i exekvering antar jag exempelvis inte är skriven som en stor oändlig for-loop

Jodå, det är så man gör. Det är svårt att fortsätta att upprepa något utan en loop Sen behöver det inte vara en stor loop (använd funktioner), inte nödvändigtvis en for-loop och inte nödvändigtvis utan testdel.

Programmet har alltid en uppgift att utföra annars kan du lika gärna köra exit(). Ibland är uppgiften att vänta på något, som användarinput eller data från nätverket.

För vissa saker har språket eller operativsystemet funktioner som väntar åt dig. När ett program anropar scanf(), läggs det i vila, drar inga resurser och returnerar inte förrän input har kommit. Om det inte finns en funktion som väntar på just det du vill vänta på, t.ex. att en joystickknapp trycks ner, lär du sova-kolla-sova-kolla-osv... där "sova" måste vara en funktion som låter ditt program vara inaktivt utan att dra systemresurser. Att sova m.h.a. en vanlig busy-waiting-loop är meningslöst, då kan man lika gärna bara kolla-kolla-kolla-osv...

Men visst, det finns C-bibliotek och operativsystem som sköter huvudloopen åt dig, t.ex. GLib där du sätter upp vilka funktioner som ska anropas för vilka events, och bara anropar typ enter_event_loop().
__________________
Senast redigerad av alef-noll 2013-11-19 kl. 20:45.
Citera
2013-11-19, 22:08
  #4
Medlem
christerys avatar
Fundera lite på vad som händer om du låter ditt program loopa, den tar all CPU. Alltså måste du lämna över kontrollen till OS ibland.

Såg ett kul exempel på detta i en NT4 burk där nån klåpare satt in 6 program (samma program,olika inparametrar) som då broderligt tog runt 16.7% av CPUn vardera. Inte för att det var nåt fel i det men den burken lyste alltid röd på övervakningsprogrammen.
Citera
2013-11-20, 12:13
  #5
Medlem
Schweinsteigens avatar
Citat:
Ursprungligen postat av alef-noll
För vissa saker har språket eller operativsystemet funktioner som väntar åt dig. När ett program anropar scanf(), läggs det i vila, drar inga resurser och returnerar inte förrän input har kommit. Om det inte finns en funktion som väntar på just det du vill vänta på, t.ex. att en joystickknapp trycks ner, lär du sova-kolla-sova-kolla-osv... där "sova" måste vara en funktion som låter ditt program vara inaktivt utan att dra systemresurser. Att sova m.h.a. en vanlig busy-waiting-loop är meningslöst, då kan man lika gärna bara kolla-kolla-kolla-osv...

Men visst, det finns C-bibliotek och operativsystem som sköter huvudloopen åt dig, t.ex. GLib där du sätter upp vilka funktioner som ska anropas för vilka events, och bara anropar typ enter_event_loop().

Citat:
Ursprungligen postat av christery
Fundera lite på vad som händer om du låter ditt program loopa, den tar all CPU. Alltså måste du lämna över kontrollen till OS ibland.

Såg ett kul exempel på detta i en NT4 burk där nån klåpare satt in 6 program (samma program,olika inparametrar) som då broderligt tog runt 16.7% av CPUn vardera. Inte för att det var nåt fel i det men den burken lyste alltid röd på övervakningsprogrammen.

Ja det är väl något åt det här håller jag skulle vara intresserad av. For-loopen ligger ju och antar jag äter en massa CPU, alltså nyttjar resurser i någon mening. Vad man skulle vilja var ju att programmet lade sig och sov då en användarinmatning ej ännu skett och då en inmatning sker exekverar programmet och detta görs tills det att programmet är klart och presenterat resultatet för användaren och därefter lägger sig och sover igen.

Nu vet jag ju inte alls ifall det fungerar så här men ifall jag sätter igång alsamixer ett program som bland annat kan reglera ljudstyrkan på mina högtalare i och samtidigt ett annat program top kontrollerar hur mycket CPU-användningen i procent ser ut så tycker jag mig notera att alsamixer bara nyttjar CPU:n då jag sitter och knappar volymen upp och ner annars existerar alsamixer i min lista över igångsatta processer men nyttjar där ej några resurser.
Citera
2013-11-20, 23:56
  #6
Medlem
Kod:
int main() {

  bool check = true;

  while(check == true) {
   
      //Do stuff

       if( user_wanna_exit )
      {
        check = false;
      }  
  }

  return 0;

}
Detta borde funka
Citera
2013-11-26, 14:03
  #7
Medlem
Du gör precis som du skrivit. Alla program som "lever" består av en huvudloop. Hur loopen ser ut beror på vad du vill uppnå och vilket system du programmerar mot. Programmerar du mot Windows använder du t ex en message loop.

http://en.wikipedia.org/wiki/Message...rosoft_Windows

Finns det inget "meddelande" i kön så kommer Windows-funktionen GetMessage() att blockera och ditt program att sova, d vs loopen snurrar inte och tar därmed ingen CPU-tid.
__________________
Senast redigerad av zynius 2013-11-26 kl. 14:10.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in