"keine Reaktion" während Berechnung
-
Ich weiß nicht wie ich dieses Problem für gogle in 3 Wörter packen sollte, und die FAQ habe ich schon durchforstet. Trotzdem müsste es eigentlich ein Problem sein, dass sehr häufig auftritt

Wenn ich mithilfe eines Buttons eine Berechnung starte, die mehrere Minuten dauert, so reagiert das Programm während dieser Zeit auf keine andere Eingabe, erst nach Abschluss der Berechnung werden diese dann ausgeführt. Auf simple Eingaben, wie z.B. "Abbruch" oder das Ändern der Position oder Größe des Fensters sollte es aber schon reagieren
Kann mir jemand weiterhelfen? Links reichen völlig aus...
-
Ich würde die Berechnung in einen Thread auslagern.
-
Stichwort Message-Queue: Jede Eingabe wird von Windows in eine Nachricht an dein Programm umgewandelt (z.B. WM_KEYDOWN (Tastendruck), WM_LBUTTONDOWN (Maustaste) oder WM_PAINT (neuzeichnen nötig)), die dann von deinem Programm verarbeitet und an die Subfunktionen weitergegeben wird. Während du mit deiner Berechnung beschäftigt bist, liegt diese Warteschlange brach - das Programm reagiert nicht mehr.
Als Lösung kannst du entweder in regelmäßigen Abständen unterbrechen und die anliegenden Nachrichten abarbeiten - oder du startest einen eigenen Thread, der sich nur um die Berechnung kümmert und dem Hauptprogramm mitteilt, wenn er fertig ist.
-
CStoll schrieb:
Als Lösung kannst du entweder in regelmäßigen Abständen unterbrechen und die anliegenden Nachrichten abarbeiten - oder du startest einen eigenen Thread, der sich nur um die Berechnung kümmert und dem Hauptprogramm mitteilt, wenn er fertig ist.
Welche Lösung ist denn emfehlenswerter? Die Nachrichtenschleife zu unterbrechen klingt einfacher, der Thread "eleganter"...oder ist es egal? Kennt jemand ein gutes Tutorial dazu? Hab nur http://www.codeworx.org/cpp_tuts_1_5.php gefunden aber irgendwie klappt das noch nicht. Der Aufruf
hThread = _beginthread( start(hChild), 0, NULL);erzeugt den Fehler:
d:\Visual Studio Projekte\silikonoel\GUI_II\GUI_II.cpp(281): error C2664: '_beginthread': Konvertierung des Parameters 1 von 'void' in 'void (__cdecl *)(void *)' nicht möglich Ausdruck vom Typ void kann nicht in andere Typen konvertiert werdenDie Deklaration der Funktion start sieht so aus:
void start(HWND hChild);Die Funktion an sich funktionierte tadellos, bis ich den Thread einzuführen versucht habe. Ich verstehe die Fehlermeldung so, dass der Compiler mit dem Return-Wert "void" nicht sehr glücklich ist. Das Seltsame ist nur, dass es im oben genannten Tutorial ja genauso gemacht wird oder?

Wär echt toll wenn mir jemand weiterhelfen könnte...
-
_beginthread(start,0,hChild);
-
Funktioniert so. Hat eine Weile gedauert, bis ich dahinterkam, dass hier Funktionsaufruf und Übergabe der Argumente getrennt werden müssen, warum auch immer...dann braucht man nur noch eine Konvertierung für hChild
(HWND)hChildund dann funktioniert das alles.Aber warum wurde dieser Aufruf so konzipiert, dass man Argumente getrennt von der Funktion übergeben muss, und dass nur als *void machen kann? Wäre es zu logisch gewesen in der Art wie ich es vorher versucht habe?

Aber egal, jetzt weiß ich wie es geht, wieder was gelernt. Vielen Dank.
-
Das liegt daran, wie in C Funktionsaufrufe aufgelöst werden:
beginthread(tfunc(x));würde erst "tfunc(x)" ausrechnen und dann dessen Rückgabewert an beginthread() übergeben
beginnthread(tfunc,x);übergibt beginthread() einen Pointer auf die Threadfunktion und einen Parameter - die Methode kann jetzt alle nötigen Datenstrukturen zur Threadverwaltung anlegen und danach (quasi in kontollierter Umgebung) "tfunc(x)" aufrufen.
(und void* wurde deshalb verwendet, weil die Funktion noch aus C-Zeiten stammen dürfte und deshalb keine Überladungen oder Templates möglich sind - schließlich kann ein void-Zeiger auf alles zeigen, was du an Daten benötigen könntest)
-
OK, deine Argumente sind schlagend, danke für die Aufklärung.
Ich hab nichts gesagt