Threads Eingabeaufforderung alle paar Sekunden



  • Hi,

    ich erzeuge 2 Threads. Im ersten Thread wird eine Variable hochgezählt.
    Im 2 Thread befindet sich das Menü.

    Nun soll im 2 Thread alle 10 Sekunden in der Konsole die Eingabeaufforderung ">>" erscheinen, wenn keine Eingabe getätigt worden ist. Mit sleep kann ich hier nicht arbeiten.
    Mir fällt grad auch nichts anderes ein, womit ich dies realisieren könnte.

    Hier einmal der Code:

    DWORD zaehler;
    DWORD inkr;
    
    unsigned _stdcall inkrement (void* arg)
    {
    
    	while(true)
    	{
    		zaehler=zaehler + (DWORD) arg;
    		//cout << zaehler << endl;
    		Sleep(15);
    		/*if(zaehler==200)
    			break;*/
    	}
    	 _endthreadex (1);
    	 return 0;
    
    }
    unsigned _stdcall menue (void* arg)
    {
    	char eingabe;
    	clock_t time;
    	HANDLE hThread_1 = (HANDLE)arg;
    
    	do
    	{
    			cout << ">> " ;
    
    		eingabe = _getch();
    
    		switch(eingabe)
    		{
    			case 'a' : cout << "Eingabe a" << endl; cout << "Zaehler: " << zaehler << endl; break;
    			case 'b' : cout << "Ende" << endl; break;
    			case 's' : cout << "Eingabe s" << endl; SuspendThread (hThread_1); break;
    			case 'f' : cout << "Eingabe f" << endl; ResumeThread (hThread_1); break;
    			case 'i' : cout << "Eingabe i" << endl; inkr = 10; break;
    			case 'n' : cout << "Eingabe n" << endl; zaehler = 0; break;
    			default: cout << "ungueltige Eingabe" <<endl;
    
    		}
    	}while(eingabe != 'b');
    
    	 _endthreadex (1);
    	 return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	zaehler = 0;
    	inkr = 1;
    	DWORD chandle,rwait;
    	unsigned int threadid_1; //Thread ID
    	unsigned int threadid_2; //Thread ID
    	HANDLE hThread_1;
    	HANDLE hThread_2;
    
    	hThread_1 = (HANDLE) _beginthreadex (NULL, 0, inkrement, (void *)inkr, 0, &threadid_1); 
    
    	if(hThread_1 == NULL)
    	{
    		ShowError("Konnte neuen Thread 1 nicht anlegen: ");
    	}
    
    	hThread_2 = (HANDLE) _beginthreadex (NULL, 0, menue, (void *)hThread_1, 0, &threadid_2); 
    
    	if(hThread_2 == NULL)
    	{
    		ShowError("Konnte neuen Thread 2 nicht anlegen: ");
    	}
    
    	rwait = WaitForSingleObject(hThread_1, INFINITE);
    	if (rwait == WAIT_FAILED)
    	{
    		ShowError("Wait fuer Thread 1 nicht erfolreich: ");
    	}
    
    	rwait = WaitForSingleObject(hThread_2, INFINITE);
    	if (rwait == WAIT_FAILED)
    	{
    		ShowError("Wait fuer Thread 2 nicht erfolreich: ");
    	}
    
    	chandle = CloseHandle( hThread_1 );
    	if(!chandle)
    	{
    		ShowError("CloseHandle Thread 1 nicht erfolgreich: ");
    	}
    
    	chandle = CloseHandle( hThread_2 );
    	if(!chandle)
    	{
    		ShowError("CloseHandle Thread 2 nicht erfolgreich: ");
    	}
    
    	_getch();
    	ExitProcess(EXIT_SUCCESS);
    	return 0;
    }
    


  • Hi

    Was willst du ??? 😕
    Und für was soll das Program oder diese Routine gut sein ?

    lowbyte



  • Einen Sinn hat das Programm keinen. Es ist allerdings meine Aufgabe so etwas zu machen.

    Was ich will?

    Thread 2 soll alle 7 Sekunden auf die Konsole ">>" schreiben, wenn keine Eingabe erfolgte,dabei aber voll funktionsfähig bleiben. (daher kein sleep)



  • Ich denke, du nimmst das Thema Multi-Threading etwas zu leicht. Du musst dich auch um die Synchronisation kümmern.

    Im Prinzip brauchst du eine Variable, die die letzte Zeit einer Eingabe speichert. Ist diese überschritten, so gibt der Thread die Meldung aus.



  • Hi,

    schau dir mal:
    GetNumberOfConsoleInputEvents
    an. Damit sollteste das hinbekommen waste vor hast.

    Praise the Lord


Anmelden zum Antworten