periodischer Funktionsaufruf + Tasten / Interrupt, Signals?
lima-city → Forum → Programmiersprachen → C/C++ und D
ablassen
ausgabe
code
dampf
dank
eingabe
funktion
http
idee
kanone
milchreis
programm
programmiersprache
signal
sprache
system
tastendruck
url
verwenden
windows
-
hallo,
ich habe so meine Schwierigkeiten mich in C++ zurecht zu finden.
Einfache Zielstellung:
- eine Funktion soll periodisch aufgerufen werden (aller 1sec)
- bei einem Tastendruck möge sich das Programm beenden.
- Windows XP
Meine Idee war es, zwei Interrupts einzusetzen.
Einen Timer, der aller 1 s feuert und einen für den Tastendruck, sodass das Programm wenn es nichts zu tun hat (Großteil der Zeit) auch nichts macht.
Ist das ein sinnvoller Ansatz?
Ich habe nicht herausbekommen wie man so etwas in C++ macht. Einige Ressourcen meinten es gäbe Interrupts nur auf 16Bit Systemen, wobei gleichzeitig festgestellt wurde, das alle Befehle zB der Ausgabe letztlich auf Interrupts zurückgreifen.
Dann fand ich noch signals.h (http://www.cplusplus.com/reference/clibrary/csignal/signal/), bei denen ich mir nicht sicher bin, ob diese solche hardware "interrupts" mit einschließen.
Ich stehe also etwas auf dem Schlauch.
Sollte man so an die Sache herangehen?
Gibt es besser Möglichkeiten?
Danke euch -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Warum löst du das Problem nicht mit Threads ?
-
bielski schrieb:
Warum löst du das Problem nicht mit Threads ?
Weil ich auf den Spatz nicht mit einer Kanone schießen wollte, so zumindest erschien mir das.
Es ist ein völlig simples Programm, das in regelmäßigem Abstand über die serielle Schnittstelle kommunizieren soll.
Die Sache mit dem Timer habe ich nun über clock gelöst.
(http://www.cplusplus.com/reference/clibrary/ctime/clock/)
Dadurch kann ich die Periodizität implementieren.
Jetzt stellt sich mir die Frage wie, ich die "unterbrecherische" Tastatureingabe lösen kann.
Die Eingabefunktionen die ich kenne verlangen alle, das man Enter drückt.
Kann ich irgendwie einfach den Eingabestream auf Inhalt prüfen? -
Hallo milchreis,
die Zeiten, in denen man direkt mit Interrupts arbeitet gehören wirklich der Vergangenheit an. Es sei denn, Du porgrammierst Treiber.
Sofern es sich bei Deinem Programm um ein Konsolenprogramm handelt muss ich bielski recht geben und empfehle Dir auch Threads zu verwenden. Der Hauptthread überwacht die eingabe und der zweite Thread führt die Funktion periodisch aus.
Und ein Thread ist ja keine 'Kanone':
#include <windows.h> #include <process.h> #include <stdio.h> void periodic_function() { static int cnt=1; printf("Call number %d\n",cnt); cnt++; } void the_thread(void * data) { while(1) { periodic_function(); Sleep(1000); } } int main() { HANDLE thread; thread = (HANDLE)_beginthread(the_thread,0,NULL); getch(); TerminateThread(thread,0); return 0; }
-
Danke dark.
Ja, es handelt sich um ein Konsolenprogramm.
Der Grund, warum ich die Idee des threads als overhead empfand, war meine naive Anahme das es in einer "ach so hardwarenahen" Programmiersprache ja wohl eine Möglichkeit geben wird, eine Tastaturinteraktion abzufragen, ohne den Programmfluss zu unterbrechen.
Aber scheinbar ist das nicht möglich? <- das würde ich gern noch wissen.
Und deshalb jetzt threads. Na gut, von mir aus.
windows.h, spitze, da ist es mit der angeblichen Portabilität der Sprache ja auch schon wieder vorbei.
Ich frage mich ob ich irgendwann nochmal begreife, was so toll an dieser Sprache sein soll. =/
Genuch gemeckert. Danke euch nochmal, mal sehen wie weit ich komme xD -
Deshalb informiert man sich richtig und findet Boost. Das ist für viele Plattformen erhältlich und unterstützt auch Multithreading.
-
reimann schrieb:
Deshalb informiert man sich richtig und findet Boost.
Ich kenne Boost. Darum ging es nicht, du hast die Intention meines posts missverstanden. -
Ja naja warum meckerst du dann über die Plattformabhängigkeit? o.o
Und da C++ möglichst viel von C übernehmen wollte ist es nunmal eine funktionale Sprache mit Extras. Ansosnten einfach modernere Sprachen verwenden wie etwa Scala oder so. Die machen sowas von vornherein.
Aber anscheinend willst du nur mal n bisschen Dampf ablassen, was ich wohl einfach missverstanden habe. -
reimann schrieb:
Aber anscheinend willst du nur mal n bisschen Dampf ablassen
Da heißt es erst, die Sprache sei "portabel" und dann braucht man extra Bibliotheken, damit das dann auch wirklich so ist, da kommt man sich etwas verarscht vor; vor allem bei der banalen Problemstellung, die auf solch (für mich) unintuitive Weise gelöst wird. Das frustet =(
Zum Glück ist ja in meinem Fall keine Portabilität erwünscht =) -
C/C++ ist im Vergleich zu Assembler deutlich portabler. Es ist aber keinesfalls plattformunabhängig.
Und es gibt nunmal Unterschiede zwischen den Systemen. Und für diese Unterschiede muss man dann eben eigene Funktionen programmieren/einbinden, die dann je nach System angewendet wird. Aber natürlich kommt es darauf an, was man eigentlich vorhat. Es kann auch gut sein, dass man für seine Zielsysteme keine Extrawurst braucht, weil es keine gravierende Unterschiede in der genutzten Infrastruktur gibt.
Beitrag zuletzt geändert: 4.6.2011 14:01:08 von bladehunter -
milchreis schrieb:
Der Grund, warum ich die Idee des threads als overhead empfand, war meine naive Anahme das es in einer "ach so hardwarenahen" Programmiersprache ja wohl eine Möglichkeit geben wird, eine Tastaturinteraktion abzufragen, ohne den Programmfluss zu unterbrechen.
Aber scheinbar ist das nicht möglich? <- das würde ich gern noch wissen.
Hallo milchreis,
an und für sich ist es schon möglich. Unter Linux wäre es einfach, da man dafür die select()-Funktion verwenden kann. Unter Windows gibt es diese Funktion auch aber dort funktioniert das nur mit Socket-Streams. Für die standard Ein- Und Ausgabe und auch bei der kommunikation über COM-Ports heißt das Zauberwort "Overlapped IO". Im vergleich dazu ist die Lösung mit den Threads trivial. Wenn Du asynchrone Kommunikation benötigst (evtl. bei den COM-Ports), dann wirst Du unter Windows aber nicht daran vorbei kommen. -
Ich bin mir nicht genau sicher, inwiefern das kompatibel oder portabel ist, aber für Unix sollte das hier auch eine gute Lösung sein:
#include <stdio.h> #include <unistd.h> #include <termio.h> #include <sys/wait.h> char getch() { char ch; struct termios oldt, newt; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); ch = getchar(); tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); return ch; } int main () { pid_t child_pid = fork(); /* fork() fehlgeschlagen */ if (child_pid == -1) { perror("fork"); return 1; } /* Kindprozess */ if (child_pid == 0) { while(1) { /* Hier das "Programm" ausfuehren */ printf("keks\n"); sleep(1); } } /* Elternprozess */ else { /* warte auf Eingabe, beende dann Kindprozess */ getch(); kill(child_pid, SIGINT); } return 0; }
Falls du es nicht einfach so abwürgen willst, kannst du auch mit einem Singalhandler noch entsprechende Maßnahmen durchführen.
LG Spacke -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage