# Selbstgeschriebenes Programm 100% CPU Last

## JoHo42

Hi Leute,

habe mir ein kleines Programm geschrieben, welches die COM Schnittstelle abfragt.

Allerdings wird dies durch eine While Schleife geloest, wodurch das Programm

100 % von der CPU benoetigt.

Dies ist eigentlich nicht wirklich schlimm allerdings moechte ich das ganz gerne

irgendwie aendern.

Ich weiss nicht ob man das unter Linux via Interrupt loesen kann oder welche

moeglichkeiten es Programmiertechnisch noch gibt.

Ich moechte jetzt nicht das nice Level von diesem Programm aendern,

ich moechte das schon irgendwie richtig Programmieren.

Vielleicht koennen mir Leute hier Links zu Dokummenten oder Forenbeitraegen

aus anderen Foren reinstellen.

Gruss Joerg

----------

## zworK

Die 100% Auslastung ist normal bei einer Dauerschleife. Der Prozess ist so immer aktiv in der Runqueue und nimmt alles an CPU Zeit die er bekommen kann.

Die einfachste Möglichkeit, die mir da spontan einfällt, ist eine Pause nach jedem Durchlauf.

```
while(...) {

... // dein Code

sleep(2000);

}
```

Das sleep legt deinen Prozess so 2 Sekunden schlafen.

----------

## JoHo42

Hallo Leute,

Probiert, geht aber das Programm laeuft dann nicht mehr richtig.

Ich denke ich brauche sowas wie frueher unter Turbo Pascal einen event manager.

Gibt es da was unter C ?

Kann man sich das war Programmieren?

Gruss Joerg

----------

## return13

wxwidgets bietet eigentlich so ziemlich alles was des Entwicklers Herz begehrt....

http://de.wikipedia.org/wiki/WxWidgets

Edit:

Zu deiner konkreten Frage http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html

----------

## firefly

 *zworK wrote:*   

> Die 100% Auslastung ist normal bei einer Dauerschleife. Der Prozess ist so immer aktiv in der Runqueue und nimmt alles an CPU Zeit die er bekommen kann.
> 
> Die einfachste Möglichkeit, die mir da spontan einfällt, ist eine Pause nach jedem Durchlauf.
> 
> ```
> ...

 

naja 2 sekunden sind auch ne menge holz bei der momentanen Prozessor-leistung. Es langt schon, wenn dein programm eine mirosekunde als pause einlegt.

EDIT ach ja dein code wartet nicht 2 sekunden sonden 2000 sekunden, da der parameter von sleep sekunden erwartet (man 3 sleep)  :Wink: 

EDIT die 2. : ersetze das sleep durch usleep und schon ist die pause nur noch 2 milisekunden lang, da usleep in mirkosekunden arbeitet.

----------

## oscarwild

Hi JoHo42,

ich weiß nicht, was Du genau vorhast. Falls schlafen und pollen nicht ausreichend ist (eine richtig "schöne" Lösung isses sowieso nicht), hilft Dir dieser Link weiter. Kann aber etwas unspaßig werden, wenns an die ioctls geht  :Wink: 

Gruiß

OscarWild

----------

## amne

Deutsches Forum  :Arrow:  Diskussionsforum.

----------

## WRadler

 *JoHo42 wrote:*   

> Ich weiss nicht ob man das unter Linux via Interrupt loesen kann oder welche
> 
> moeglichkeiten es Programmiertechnisch noch gibt.
> 
> 

 

Über ioctl sollte doch was möglich sein, ansonsten ist vielleicht

```
man 4 rtc
```

interessant, aber nur für x86 und alpha(?).

----------

## JoHo42

Hi Leute,

danke fuer die Antworten.

Aber so ganz zufrieden bin ich irgendwie nicht.

Die schnelle und schmutzige Loesung mit dem sleep habe ich ausprobiert,

das wuerde fuer das erste ausreichen.

Aber es muss doch rigendwie eine moeglich geben unter Linux einen Eventmanager

einzurichten.

Ich kann mich da aus den Zeiten von Turbo Pascal an sowas erriennern.

Dort wurde ein Eventmanager eingerichtet um auf Tastendruck durch die Maus

zu reagieren.

Es macht ja keinen Sinn sachen die an der Com-Port haengen immer wieder

via While Schleife abzufragen.

Linux muss doch von sich aus sagen, dass sich dort was veraendert hat und dies

meinem Programm mitteilen.

Vielleicht so Interrupt maessig oder so.

Gruss Joerg

----------

## WRadler

Guck mal da:

http://www.lafn.org/~dave/linux/Serial-Programming-HOWTO.txt

unter 3.  Opening steht folgendes:

 *Quote:*   

> In blocking mode, a read(2) will block until data is available or a
> 
>   signal is received.

 

Besser kann man es doch gar nicht haben, oder?

Dein Programm hängt so lange faul rum, bis Daten ankommen.

----------

## JoHo42

Hi Leute,

die blocking Read moeglichkeit ist auch nicht so dolle.

Ich muss zwei Schnittstellen abfragen z.B.

While (1)

{

     schnittstelle1();

     schnittstelle2();

}

Gehe ich in den Blockingmode wuerde die zweite Schnittstelle nicht mehr abgefragt werden.

Gehe ich in den nicht Blockingmode wird die While Bedingung immer wieder durchlaufen.

Das waere fuer mich ein Fall von Softwareinterrups.

Dann wuerde naemlich die Schnittstelle abgearbeitet werden, die gerade Daten empfaengt.

Die Idee mit den wxWidgets ist nicht schlecht, das muss aber auch irdendwie besser gehen,

ich meine ohne noch so ein gelumpe hinter einem einfachen konsolen Programm.

Gruss Joerg

----------

## oscarwild

Also... in dem Link, den ich bereits gepostet habe, steht eigentlich alles ganz exakt und verständlich drin  :Rolling Eyes: 

http://www.easysw.com/~mike/serial/serial.html#5_2

----------

## WRadler

 *JoHo42 wrote:*   

> Hi Leute,
> 
> die blocking Read moeglichkeit ist auch nicht so dolle.
> 
> Ich muss zwei Schnittstellen abfragen z.B.
> ...

 

Nein, das ist ein Fall für Threads

----------

## oscarwild

 *WRadler wrote:*   

> das ist ein Fall für Threads

 

zunächst ein klarer Fall für select...

Falls die Applikation während des Wartens noch etwas anderes tun soll, wofür die Verwendung eines select-Timeout nicht ausreicht, DANN kann man über Threads nachdenken.

----------

## WRadler

 *oscarwild wrote:*   

> Falls die Applikation während des Wartens noch etwas anderes tun soll, wofür die Verwendung eines select-Timeout nicht ausreicht, DANN kann man über Threads nachdenken.

 

Oder, wenn ankommende Daten möglichst schnell weitergeleitet werden sollen.

Auf einen timeout zu warten, verzögert das Lesen von der anderen Schnittstelle.

Außerdem müsste die Prozessorbelastung bei select höher sein (was hier aber vermutlich zu vernachläsigen ist).

----------

## oscarwild

 *WRadler wrote:*   

> Oder, wenn ankommende Daten möglichst schnell weitergeleitet werden sollen.
> 
> Auf einen timeout zu warten, verzögert das Lesen von der anderen Schnittstelle.

 

Nein. genau das ist ja der Sinn von select...

select kehrt zurück, sobald auf einer der überwachten Filedescriptoren neue Daten hat, bereit zur Annahme von Daten ist etc.

Der Timeout lässt select optional bei Inaktivität der überwachten FDs zurückkehren, z.B. damit sich die Applikation nebenher um andere Dinge kümmern kann, falls erforderlich.

select ist exakt für den beschriebenen Anwendungsfall gedacht, und Posix-Standard...

Aber ich betone nochmal - das alles ist in dem verlinkten Dokument wirklich hervorragend beschrieben... auch ein man select ist recht aufschlussreich.

 *WRadler wrote:*   

> Außerdem müsste die Prozessorbelastung bei select höher sein (was hier aber vermutlich zu vernachläsigen ist).

 

Ganz im Gegenteil!

Löst man das Problem mit Hilfe zweier Threads, die blockierend von den Schnittstellen lesen, braucht es zusätzlich einen Mechanismus, um beide Threads zu synchronisieren.

----------

## WRadler

OK, dankeschön, hab mich geirrt.

(ich sollte Texte vielleicht nicht nur überfliegen)

----------

## JoHo42

Hi Leute,

danke fuer eure Mithilfe.

Aber die Loesung mit dem select ist genial.

Ich habe mal wieder erst beim zweiten Hinsehen verstanden wie gut das ist.

Das ist eigentlich das was ich fruher als Eventhandler bezeichnet habe.

Ich verstehe wohl noch nicht den unterschied zwischen Poll und Select.

Muss ich in ein Modul extra ein Poll einbauen, damit die Software mit select

arbeiten kann.

Oder besser gefragt, was mach Poll.

Gruss Joerg

----------

## firefly

nein poll und select tun in prinzip das selbe. Die beiden funktionen wurden fast gleichzeitig von 2 versch. Systemen entwickelt. select wurde in BSD Unix eingeführt und poll ist eine System-V Lösung. (quelle: http://www.oreilly.de/german/freebooks/linuxdrive2ger/exselect.html)

beide funktionen sind im POSIX standard spezifiziert. Es scheint so, das select portabler ist, da es auf weit mehr systemen vorhanden ist als poll.

weiter infos:

http://www.developerweb.net/forum/archive/index.php/t-2948.html

----------

