FighterFigger Geschrieben 21. Mai 2003 Teilen Geschrieben 21. Mai 2003 Hallo - seid gegrüßt im alltäglichen Chaos. Ich habe da heute eine schöne Frage aus dem Bereich Multithreading für euch: Ich habe eine MFC-DialogAnwendung (VC++6.0), die ganz einfach eine ProgressBar in einem extraDialog zeigen soll. Der Zählprozess soll aber auch durch einen auf dem VerlaufsDialog plazierten "Cancel-Button" abgebrochen werden können. Damit ich den Knopf während des Zählens benutzen kann, lasse ich den Zählvorgang in einem Worker-Thread zählen, der vom Dialog ins Leben gerufen wird (AfxBeginThread), dieser greift auch gleich auf die ProgressBar des Dialog zu. Nun soll aber nach vorzeitigem Abbruch der Dialog erst geschlossen werden, wenn der Thread auch wirklich weg ist. Das soll er mit kurz vor seinemm Ableben durch ein Zeichen Signalisieren. Warte ich auf dieses Zeichen aber mit einer Schleife wie while (Zeichen != true) { }dann scheint diese Schleife die komplette CPU für den HauptThread zu blockieren, der WorkerThread macht nämlich plötzlich nicht mehr weiter. Ich muß einen Thread doch bis zu bestimmten Ereignissen Schlafen legen können, aber bei CEvent lief das nicht besonders (der Hauptthread hat nicht wirklich immer gewartet) Wie lasse ich am einfachsten den HauptThread auf den WorkerSet warten? Hat jemand damit Erfahrung? ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Mai 2003 Teilen Geschrieben 22. Mai 2003 Du kannst z.B. direkt mit WaitForSingleObject auf das Threadhandle warten, du kannst aber auch in einer Schleife wiederholt GetExitCodeThread aufrufen. Damit die Schleife nicht den Prozessor blockiert, solltest du ein Sleep einbauen. Das bewirkt, dass der aktuelle Thread seine Zeitscheibe vorzeitig aufgibt und der nächste an die Reihe kommt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FighterFigger Geschrieben 22. Mai 2003 Autor Teilen Geschrieben 22. Mai 2003 Das ist ein feiner Fortschritt, denn die Anwendung läuft nun schon stabiler. Ich habe mich für MsgWaitForMultipleObjects entschieden, mit dem ich den Hauptthread (Dialog) schlafen lege, da der WorkerThread u.U. noch auf dessen DialogObjekte zugreifen will, und der Dialog daher bei Messages wach sein muß. Nun will ich aber immer, wenn ich aufwache weil eine Message reinkam (und nicht weil der WorkerThread abgeschlossen ist) diese Message wegwerfen, oder verbrauchend lesen. Wie entferne ich Messages aus einer MessageQueue? Ich versuchte zB. mit: const MSG* msg = GetCurrentMessage(); SendMessageToDescendants(msg->message, msg->wParam, msg->lParam); oder ähnlichen Konstrukten, jedoch mit mäßigem Erfolg. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Mai 2003 Teilen Geschrieben 23. Mai 2003 Wenn dein Dialog weiterhin Nachrichten bearbeiten soll, während du auf das Ende des Workerthread wartest, dann geht das so nicht. Du befindest dich ja gerade in der Behandlungsfunktion für eine Nachricht (die Click-Nachricht deines Cancel-Buttons). Da musst du erst wieder raus, bevor du weitere Nachrichten empfangen kannst. Der Workerthread könnte z.B. eine besondere Nachricht an den Dialog senden, wenn er fertig ist. Für diese Nachricht legst du dann im Dialog eine Behandlungsfunktion an. Wie das geht, steht in diesem Beitrag (nur die drei fettgedruckten Zeilen sind für dich interessant). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FighterFigger Geschrieben 23. Mai 2003 Autor Teilen Geschrieben 23. Mai 2003 Einfach und perfekt - es funktioniert einwandfrei. Danke! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.