2009-06-18 13 views
1

Wenn ich try/catch in WindowProc override von MFC-Fenster/Ansicht Klassen verwenden, gibt es einen Leistungseinbruch. Warum ist es so und was ist die Alternative?Verwenden von versuchen/fangen in WindowProc MFC

Dies fing ich als Ergebnis der Profilerstellung. Wenn Sie den Block entfernen, verbraucht die Funktion viel weniger Zeit. Ich benutze MS VS 2008.

Antwort

1

In usage-of-try-catch-blocks-in-c Todd Gardner erklärt, dass Compiler den "Tabellen" -Ansatz oder den "Code" -Ansatz verwenden, um Ausnahmen zu implementieren. Der "Code" -Ansatz erklärt den Leistungseinbruch.

+0

Ich benutze MS VS 2008, woher weiß ich, welchen Ansatz es verwendet? – vikash

+0

MSVC kann beides verwenden; Von Ihren Messungen scheint es, dass es den Code eins verwendet. ISTR das gilt für x86-32-Code. – MSalters

2

Nur mit Versuch/Fang sollte nicht zu einem Leistungseinbruch führen - vielleicht werfen Sie zu viele Ausnahmen? Haben Sie Ihren Code profiliert, um herauszufinden, woher der Leistungshit kommt?

+0

Sehr guter Punkt. Der Performance-Footprint kann etwas völlig anderes sein und es ist besser, vor jeder Analyse ein Profil zu erstellen. – sharptooth

0

Ich bin sicher, dass Sie wissen, dass WindowProc eine Menge Verkehr verarbeitet. Jeder Code außerhalb der Switch (Nachricht) Schleife wird von jeder Nachricht ausgeführt, die durch die Pumpe geht.

Ich habe gerade eine kleine Dialog-basierte MFC-App gemacht, wo ich das WindowProc überschreibe und einfach zähle, wie oft es aufgerufen wird. Der Test hat gezeigt, dass das Bewegen des Mauszeigers über den Dialog mehr als 1000 WindowProc-Aufrufe pro Sekunde erzeugt.

Nur etwas zum Nachdenken.

p.s. Ich hätte das als Kommentar hinzugefügt, aber ich habe noch nicht genug Reputationswerte dafür.

+0

Ja, der Windowproc wird mehrmals mehr als 1000 aufgerufen. Ich habe einen try/catch für Ausnahmen, die innerhalb des windowproc ausgelöst werden. Das Hinzufügen von try/catch erhöht die Ausführungszeit von windowproc – vikash

0

In Ihrer App-Klasse werfen Sie einen Blick auf überschreiben CWinApp::ProcessWndProcException. Dies gibt Ihnen eine Chance auf nicht abgefangene MFC CException s (und Derivate) in jedem Befehl oder Message-Handler ausgelöst.

Wenn Sie bei ALLES eine letzte Chance brauchen, müssen Sie sich einen eigenen SEH-Filter installieren.

+0

CWinApp :: ProcessWndProcException würde es mir erlauben, nur bei MFC Expections (CException & derivatives) eine Chance zu nehmen. Danke – vikash

1

Die Alternative ist, den try-catch um Ihren eigenen Code zu legen. Die meisten Aufrufe an Ihr WndProc enden in DefaultWindowProc *, das C++ - Ausnahmen nicht auslöst. Indem Sie try/catch näher an Ihren eigenen Code verschieben, sparen Sie viel Aufwand.

[*] DefaultWindowProc kann SEH-Exceptions auslösen, zum Beispiel um den Stack zu vergrößern, aber Sie sollten diese nicht behandeln.

+0

Antwort inspiriert von Ropes Beobachtung. – MSalters