Hi,
die meisten kennen ja vermutlich das Konzept. Einfaches Beispiel:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
void foo()
{
WaitCursorObject wco;
someComplicatedOperations();
finalize();
}
|
Wie kann ich dieses Konzept aber weiterhin nutzen, wenn ich z.B. so eine Architektur habe:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void foo()
{
// WaitCursorObject wco; ?
showWaitCursort();
// so kompliziert, dass es intern einen Berechnungsthread startet oder auf irgendeinem anderen
// Weg asynchrone Arbeit verrichtet
someComplicatedOperations();
// wco geht out of scope und setzt den Cursor in seinem Destruktor wieder zurück.
// Hat den Vorteil, dass man das manuelle Löschen/Freigeben/Rücksetzen nicht vergisst,
// wenn man den Scope z.B. außerplanmäßig durch frühere returns oder sogar exceptions
// verlässt.
}
// die Berechnung benachrichtigt diese Programmebene z.B. per Event, Qt-Signal oder indem die Funktion direkt als Callback aufgerufen wird.
void operationFinished()
{
finalize();
showWorkCursor();
}
|
Wie man sieht, muss ich den Cursor jetzt wieder manuell setzen, kann mich nicht mehr auf den scope-basierten Automatismus verlassen (denn der Scope: foo reicht ja jetzt nicht mehr, der Berechnungsthread läuft höchstwahrscheinlich ja noch im Hintergrund) und bin damit wieder anfällig für Bugs, indem ich das irgendwo falsch mache oder vergesse. Gibt es hier dennoch eine Möglichkeit, irgendwie die Stärke von RAII zu nutzen?