In regelmäßigen Abstand Funktion aufrufen
-
Was mache ich flasch?
int var = 0; CRITICAL_SECTION CriticalSection; DWORD WINAPI Thread(LPVOID Data) { timeBeginPeriod(1); DWORD interval = 30; // in milliseconds ::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); DWORD t0, t1 = ::timeGetTime(); while (true) { t0 = t1; printf("(%i)", var); t1 = ::timeGetTime(); DWORD diff = t1 - t0; if (diff < interval) Sleep(interval - diff); } return((DWORD)Data); } DWORD WINAPI Funktion(LPVOID Data) { while (true) __try { EnterCriticalSection(&CriticalSection); var = 1; //symbolisch für var löschen Sleep(1); var = 0; //symbolisch für var null terminieren } __finally { LeaveCriticalSection(&CriticalSection); } return((DWORD)Data); } #include <conio.h> int main() { HANDLE hThread = CreateThread(NULL, 0, Thread, (LPVOID)1, 0, 0); HANDLE hThread2 = CreateThread(NULL, 0, Funktion, (LPVOID)2, 0, 0); InitializeCriticalSection(&CriticalSection); while (getch() != 27); DeleteCriticalSection(&CriticalSection); CloseHandle(hThread); CloseHandle(hThread2); }Sleep soll andeuten, dass der Löschvorgang länger dauern kann. Die ganze Zeit soll kein anderer Thread drauf zugreifen können. Bei mir wird aber immer 1 ausgegeben ... es sollte doch 0 sein ... ich verstehe nicht, warum das nicht klappt.
MfG
-
Du musst das CriticalSection-Objekt schon initialisieren, bevor du es benutzt; nachdem du die Threads gestartet hast, ist es etwas zu spät.
Dann solltest du das CriticalSection-Objekt auch in beiden Threads benutzen, nicht nur in einem.
Und die Thread-Funktionen sollten irgendwann auch return aufrufen, sonst laufen die nach dem Ende von main() noch weiter und verursachen Speicherzugriffsfehler.
-
Auch wenn ich das in dieser Reienfolge mache:
InitializeCriticalSection(&CriticalSection); HANDLE hThread = CreateThread(NULL, 0, Thread, (LPVOID)1, 0, 0); HANDLE hThread2 = CreateThread(NULL, 0, Funktion, (LPVOID)2, 0, 0);besteht der beschriebene Fehler weiterhin ...
-
Hast du die anderen beiden Punkte, die ich genannt habe, auch umgesetzt?
-
Die andere Funktion hat keinen kritischen Bereich ... darum halte ich es nicht für sinnvoll, dort auch mit einem kritischen Bereich zu arbeiten ... habe statt der while(1) ne schleife genommen.
grüße
-
Thomas_ schrieb:
Die andere Funktion hat keinen kritischen Bereich ... darum halte ich es nicht für sinnvoll, dort auch mit einem kritischen Bereich zu arbeiten
Genau das ist aber der Sinn einer "CriticalSection": Zu einem Zeitpunkt kann sie nur ein einziger Thread in Beschlag nehmen. Du musst also EnterCriticalSection sowohl im ersten als auch im zweiten Thread aufrufen; dadurch verhinderst du, dass die sich in die Quere kommen. Denn wenn der erste Thread durch EnterCriticalSection den Zugriff erhalten hat, wird der andere Thread in EnterCriticalSection solange blockiert, bis der erste mit LeaveCriticalSection den Zugriff wieder freigibt.
-
zu beachten wäre da noch: eine critical section sollte möglichst schnell wieder verlassen werden. wenn ein thread mit 'Sleep' in einer CS wartet, müssen alle anderen auch so lange warten, die in der CS festhängen...

-
Ich möchte mich bei allen bedanken!
Du musst also EnterCriticalSection sowohl im ersten als auch im zweiten Thread aufrufen;
--> macht Sinn ... ich muss ja für einen einzigartigen Schreibzugriff, aber auch Lesezugriff achten ... das ist logisch ... und funzt sogar

--> auch das ist richtig ... Sleep sollte stellvertretend dür eine langandauernde Löschfunktion stehen. Es macht keinen Sinn Sleep dort hinzuschreiben ... aber für diesen Beispielzweck erfüllt es seine Funktion
Grüße & DANKE!!!
-
unter windows gibts doch sowas wie SetTimer() oder!?
-
gibt es ... wird dabei nicht das System lahm gelegt?? gut zu wiisen ... bin ich heute nicht um sonst aufgestanden

-
warum sollte das das system lahm legen!?
-
Thomas_ schrieb:
gibt es ... wird dabei nicht das System lahm gelegt?? gut zu wiisen ... bin ich heute nicht um sonst aufgestanden

meine das mehr so: Das System wird dabei also nicht lahm gelegt. Doppelverneinungen sind doof!
