Direkte anfragen vom Eingabebuffer
-
Ne geht leider nicht. Hab irgendwo khbit gelesen aber da wird der Eingabepuffer nicht geleert oder so und dann muss man doch widda getch() nehemn
-
ja fgets hält an
-
Da ich annehme, dass du hier unter UNIX bzw. Linux arbeitest (wegen ncurses-Bezug), mit POSIX-Threads sieht das so aus:
#include <pthread.h> #include <stdio.h> #include <unistd.h> void *loop_thread(void *interrupted_ptr_void) { int *interrupted_ptr = interrupted_ptr_void; while(!*interrupted_ptr) { puts("loop_thread"); sleep(1); } } int main(void) { int interrupt = 0; pthread_t loop_id; pthread_create(&loop_id, NULL, &loop_thread, &interrupt); getchar(); interrupt = 1; pthread_join(loop_id, NULL); return 0; }
-
Ne leider unter Windows. Ncurser habe ich bloß so beim Suchen gefunden
-
Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Kuckuck !
Du könntest einen extra Tread, der die Konsole liest, laufen lassen.
Gruß,p.
-
Ein Blick in die MSDN enthüllt die Funktion _kbhit() (laut dortigen Angaben verfügbar für Win95 und Win NT). Ansonsten könntest du dir mal die GetAsyncKeyState()-Funktion ansehen.
-
Naja GetAsyncKeyState() geht nicht, weil sich die Funktion in das komplette System einhackt. D.h, wenn ich das Konsolenfenster deaktiviere(minimiere) und dann nem anderen Progg eine Taste drücke kommt die Message trotzdem im K-Fenster an.
_kbhit erweist sich als auch keine echte Lösung, weil na dem aufruf tortzdem ein _getch() aufrufen muss.
Mhh, was könnte man noch machen? Wie ist das mit den Treads?
Gruß
-
Hallo,
Beispiel mit boost
#include <boost/thread/thread.hpp> #include <iostream> bool allowed = true; void run(){ //for(init, condition, action) if(allowed){} //... } int main(){ boost::thread runner(&run); while(true) //abort thread? //if(condition) allowed = false; }
MFG
-
So Problem behoben. Hab mich für die Thread-Methode entschieden. und zwar sollte es ein Programm sein, das mit fmod.dll MP3s aus einem Verzeichnis spielt Hier könnt ihr mal den Quellcode angucken:
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include "wincompat.h" #include "fmod.h" #include "fmod_errors.h" #include <dirent.h> #include <string.h> #include <conio.h> #define BUF_SIZE 255 FSOUND_STREAM *sample; int check; int lp; int l; // Lange der Datei in MS DWORD WINAPI ThreadFunc(LPVOID data) { char chr; for(;;) { chr=_getch(); if(chr==' ') { if(check==0) { FSOUND_Stream_Stop(sample); lp=FSOUND_Stream_GetTime(sample)+3; check=1; } else { FSOUND_Stream_Play(FSOUND_FREE, sample); FSOUND_Stream_SetTime(sample,lp+45); lp=0; check=0; } fflush(stdin); } if(chr=='n') { FSOUND_Stream_SetTime(sample,l-12); } Sleep(30); } // gibt den Wert zurück den du bekommen hast return((DWORD)data); } // end ThreadFunc using namespace std; int main() { HANDLE hThread[1]; DWORD dwThreadID; int p; // Aktuelle Lange der Musikdatei float percent;// Aktuelle Prozentanzahl wiedergegeben char pfad[150]; // Erzeugt den Pfad DIR *hdir; // Verzeichnis Varia struct dirent *entry; if (FSOUND_GetVersion() < FMOD_VERSION) { printf("Error : You are using the wrong DLL version! You should be using FMOD %.02f\n", FMOD_VERSION); exit(1); } FSOUND_Init(44100, 128, 0); hdir = opendir("Musk"); do { entry = readdir(hdir); if (entry) { sprintf(pfad,"Musk/%s",entry->d_name); if((strcmp(entry->d_name,".")==0) || (strcmp(entry->d_name,"..")==0)) continue; sample=FSOUND_Stream_Open(pfad,FSOUND_NORMAL,0,0); FSOUND_Stream_SetMode(sample, FSOUND_LOOP_OFF); FSOUND_Stream_Play(FSOUND_FREE, sample); l=FSOUND_Stream_GetLengthMs(sample); printf("%s\n",entry->d_name); printf("Gesamtlange in Sekunden: %d s\n",l/1000); printf ("Verganghende Zeit: \n\n"); hThread[1]= CreateThread( NULL, 0, ThreadFunc, (LPVOID)0, 0, &dwThreadID); for(; ;) { p=FSOUND_Stream_GetTime(sample); percent=100/(float)l; percent*=(float)p; printf("\r"); printf("%d s %0.2f Prozent",p/1000,percent); Sleep(80); if(FSOUND_Stream_GetTime(sample)==l) { FSOUND_Stream_Stop(sample); break; } } // Auf die Threads warten, bis sie fertig sind WaitForMultipleObjects( 1, // Anzahl der Threads, auf die gewartete werden muss hThread, // Handles der Threads TRUE,INFINITE); // Wie lange soll gewartet werden, INFINITE = unendlich lange // Alle Threads sollten beendet sein CloseHandle(hThread[1]); printf("\n\n"); } }while (entry); closedir(hdir); system("pause"); return 0; }
Gruß PillePalle