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