Welchen Include für Critical Section
-
OK, ich habe es versucht, doch ich komme mit dem
"LPCRITICAL_SECTION lpCriticalSection" nicht zurecht.
(Sogar mal was in der MSDN gefunden
)Kann mir das nicht doch Jemand mal einbauen, sonnst muß ich wieder 1000 Fragen zu diesem neuen Problem stellen, denn an den Beispiel lernt man doch am schnellsten.
-
Das heisst doch nicht anderes, als dass du eine Adresse übergeben sollst.

CRITICAL_SECTION CriSect; main (..) { .... InitializeCriticalSection (&CriSect); .... }Usw.
[Edit]Rechtschreibung[/Edit]
-
MisterX schrieb:
OK, ich habe es versucht, doch ich komme mit dem
"LPCRITICAL_SECTION lpCriticalSection" nicht zurecht.
(Sogar mal was in der MSDN gefunden
)Dann lies doch einfach ein paar Zeilen weiter - "LPCRITICAL_SECTION" ist ein Pointer auf eine CRITICAL_SECTION, d.h. du mußt dort die Adresse (Stichwort &) eines CRITICAL_SECTION-Objekt übergeben, das du vorher definiert hast.
-
JUHU, es klappt jetzt, DANKE.
Aber ich habe auch
Parameters lpCriticalSection [out] Pointer to the critical section object.gelesen.
Aber wie kommt man darauf, dass das Objekt
CRITICAL_SECTION
mit Bindestrich heißen soll, wenn in der MSDN
[out] Pointer to the "critical section" object.steht?

Mir ist schon klar, das es keine Leerzeichen enthalten darf, aber ich habe Vieles Probiert: Kleingeschrieben mit Bindestrich, groß mit Unterstrich, nur leider die richtige Version nicht.
-
MisterX schrieb:
Aber wie kommt man darauf, dass das Objekt
CRITICAL_SECTION
mit Bindestrich heißen soll, wenn in der MSDN
[out] Pointer to the "critical section" object.steht?

Indem man einfach ein wenig weiter liest:
MSDN Library schrieb:
The process is responsible for allocating the memory used by a critical section object, which it can do by declaring a variable of type CRITICAL_SECTION
-
DANKE!!!!!!!,
jetzt habe ich erst mal verstanden, wie so ein MSDN Artikel generell aufgebaut ist

Noch eine Frage zum Thema:
Kann ich die Critical Section auch in mein Objekt selbst einbauen etwa so:class Point { private: CRITICAL_SECTION CriSect; int m_x; int m_y; public: Point () { InitializeCriticalSection(&CriSect); } void setXY(int x,int y) { EnterCriticalSection(&CriSect); m_x = x; m_y = y; LeaveCriticalSection(&CriSect) ; } void gibaus() { EnterCriticalSection(&CriSect); printf("%d " ,(int)m_x ); printf("%d \n",(int)m_y ); LeaveCriticalSection(&CriSect) ; } };oder ist das falsch?
-
Fast richtig - jetzt brauchst du nur einen Destruktor, der DeleteCriticalSection() aufruft (und entsprechend der "Rule of Three" einen Copy-Ctor und Zuweisungsoperator, sonst steht dir ein Systemcrash bevor).
-
Sowas würde man aber in der Realität nie programmieren. Man verschiebt die Thread-Synchronisation weiter nach aussen.
-
jetzt habe ich den Konstruktor eingebaut
class Point { private: CRITICAL_SECTION CriSect; int m_x; int m_y; public: Point () { InitializeCriticalSection(&CriSect); } ~Point () { DeleteCriticalSection(&CriSect); } void setXY(int x,int y) { EnterCriticalSection(&CriSect); m_x = x; m_y = y; LeaveCriticalSection(&CriSect) ; } void gibaus() { EnterCriticalSection(&CriSect); printf("%d " ,(int)m_x ); printf("%d \n",(int)m_y ); LeaveCriticalSection(&CriSect) ; } };Aber was ist mit "Rule of Three" gemeint?
Wenn ich danach suche erhalte ich immer Theroien zu 3 großen marktbeherschenden Firmen
Und was ist ein einen Copy Construktor?
-
CStoll schrieb:
sonst steht dir ein Systemcrash bevor
ach quatsch. windows verträgt eine ganze menge

-
MisterX schrieb:
Aber was ist mit "Rule of Three" gemeint?
Wenn ich danach suche erhalte ich immer Theroien zu 3 großen marktbeherschenden Firmen
Kurzform: Wenn eine Klasse eine der "großen 3" Methoden (Destruktor, Copy-Construktor, operator=) benötigt, benötigt sie typischerweise alle drei.
oder ausführlicher für deinen Fall:
Dein Dtor zerlegt die Critical Section - die vom Compiler erzeugten Kopier-Methoden kopieren diese jedoch blind weiter. D.h. wenn ein Point-Objekt kopiert wird, arbeiten beide Objekte mit der selben Critical Section (das führt im besten Fall dazu, daß sie sich gegenseitig aussperren, im schlimmsten Fall versuchst du irgendwann, eine nicht-initialisierte CritSec zu verwenden.@net: Wenn Windows das kompensieren kann, hast du viel Glück gehabt - ich würde mich nicht darauf verlassen
