Zum Inhalt springen

MFC: CEvent und Threads


Empfohlene Beiträge

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? ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...