Thread-Überwachung bzw. Unterbrechung



  • Hallo Forum,

    mal wieder bereitet mir das Threading ein paar Kopfschmerzen. Weniger die Programmierung als ein gutes Konzept.

    Ich hab folgendes Problem:
    Mein Programm führt zwischenzeitlich einige komplizierte Berechnungen aus und verwendet die Rechenergebnisse dann gleich weiter. Damit das Programm aber nicht in diesen Berechnungen versackt, habe ich diese immer in einen eigenen Thread ausgelagert, den ich im Notfall unterbrechen kann. Das funktioniert auch supi mit folgendem Code:

    Thread^ oThread = gcnew Thread( gcnew ThreadStart( &Mathematics::DoLevenberg ) );
    						//Set lowest priority
    						oThread->Priority = Threading::ThreadPriority::Lowest;
    						//Clear Message queue
    						Application::DoEvents();
    						//Start Thread
    						oThread->Start();
    						//Sleep 500 ms
    						Thread::Sleep(500);
    						//Loop for checking keyboard input while other thread is active
    						bool abortcontrol = false;
    						while(oThread->IsAlive)
    						{
    							//KeyAvailable checks message queue for keypress
    								//returns true if a key has been pressed
    							if(Console::KeyAvailable)
    							{
    
    								Monitor::Enter(Console::Out);
    
    								//Read key
    								cki = Console::ReadKey(true);
    								Console::WriteLine(L"The fit has been paused! Do you really want to abort the regression?");
    								Console::WriteLine(L"Press ESCAPE to abort the thread other keys will continue.");
    								//Read key
    								cki = Console::ReadKey(true);
    								if(cki.Key == ConsoleKey::Escape)
    								{
    									oThread->Abort();
    									abortcontrol = true;
    									Monitor::Exit(Console::Out);
    									break;
    								}
    								Monitor::Exit(Console::Out);
    							}
    							//Sleep for other thread to be processed
    							Thread::Sleep(500);
    						}
    						if (abortcontrol)
    						{
    							FreeConsole();
    							delete oThread;
    							break;
    						}
    						else//Wait for other thread
    							oThread->Join();
    						Console::WriteLine(L"Press ENTER to continue...");
    						Console::ReadLine();
    						FreeConsole();
    

    Das ganze funktionert so wunderbar, weil ich es über eine Konsole mache, deren Eingabestrom ich mittels Console::KeyAvailable (Zeile 16) einfach überwachen kann.

    So weit so gut!

    Nun haben sich die Nutzer meines Programms aber negativ über die Konsole geäußert. Sie hätten es gern als Teil des Programmfenster selbst. Also will ich die Konsole jetzt umgehen. Mein Problem ist jetzt ein geeignete Überwachungseigenschaft zu finden. Ich hatte eigentlich etwas mit der Meldungsschleife des Programmes im Hinterkopf, aber dazu finde ich keinen richtigen Zugang. Ich kann aber auch keinen Button verwenden, da das Programm dessen Ereignis erst ausführen würde, wenn ich aus der while-Schleife (Zeile 12) wieder raus bin.

    Meine Frage an euch: Wie würdet ihr es machen oder was könnte man geeignetes überwachen?

    Danke
    physici


Log in to reply