CCriticalSection
-
Hallo
ich versuche CriticalSection in meinen Threads anzuwenden.
Doch klappt es nicht, denn die Threads benutzen die Funktion immer noch alle gleichzeitig.
Hier ein wenig Code damit ihr seht was ich gemacht habe.Thread erstellen:
CMyThread *mMyThread; mMyThread= (CMyThread *) AfxBeginThread(RUNTIME_CLASS(CMyThread), NULL, 0, CREATE_SUSPENDED); // Pointer usw. mMyThread->ResumeThread();Thread code:
BOOL CMyThread::InitInstance() { criticalSection.Lock(); pView->Test(); criticalSection.Unlock(); }In der Test Funktion wird eine MessageBox aufgerufen und danach eine unendliche Schliefe, sodass der Thread in ihr gefangen ist.
Doch trotzdem wird die MessageBox in der Funktion mit jedem neuen Thread wieder ausgeführt. Doch theoretisch dürfte kein Thread in die Funktion mehr gelangen da ein Thread mit Hilfe der unendlichen Schleife gefangen ist oder?::MessageBox(hWnd,"Thread aktivieren1.","Test", MB_OK); while(1) ;Wo liegt mein Fehler und was muss ich machen damit es funktioniert.
Danke
-
Wo hast du denn deine CriticalSection angelegt? Vor allem bist du dir ganz sicher, daß jeder Thread das selbe Objekt verwendet?
-
Also ich habe einfach eine Varibale in CMyThread deklariert und zwar wie folgt:
private: CCriticalSection criticalSection;Zu dem zweiten Teil deiner Frage bin ich jetzt ein wenig überfragt.
Wie kann ich das herausfinden?
Wäre das bei dem Code (den ich gepostet habe) der Fall?
-
Thread schrieb:
Also ich habe einfach eine Varibale in CMyThread deklariert
Dann hat jeder Thread seine eigene Critical Section. Die blocken sich nicht gegenseitig. Du brauchst eine für alle.
-
Hört sich super an.
Jetzt wäre es super wenn ihr mir noch eben zeigt wie ich folgendes hinbekomme:Du brauchst eine für alle
Danke
-
Deklarier doch die CS als static.
-
Habe die Variable als static deklariert.
Doch dann bekomme ich folgende Fehlermeldung:AdoDatabase error LNK2001: Nichtaufgelöstes externes Symbol "private: static class CCriticalSection CMyThread::criticalSection" (?criticalSection@CMyThread@@0VCCriticalSection@@A)
-
Du musst die Variable noch definieren, wie jeden static-Member. Für jemanden, der Threads benutzt, hast du aber noch recht große Lücken bei den Grundlagen

-
...es fehlt also noch:
CCriticalSection CMyThread::criticalSection;am Anfang deiner mythread.cpp
-
Danke
für eure Hilfe
es funktioniert
-