Ik heb een applicatie via VC6 (zonder service packs) gecompileerd en gelinked, welke wel goed werkt als Debug build, maar niet als Release. Het probleem is dat de Release build blijft wachten op een semaphore die door een externe applicatie wordt vrijgegeven. De Debug build merkt wel dat deze semaphore wordt vrijgegeven en gaat vrolijk verder. In hoeverre kan er verschil zitten tussen Debug en Release builds? Bij deze de relevante code van beide applicaties, misschien dat er in de code wat fout zit, maar aangezien de Debug werkt, vraag ik me af of dit het probleem is.
server (LabWindows) wacht tot semaphore "Kilnlog Server Memory Semaphore" wordt vrijgegeven, zet dan een stuk geheugen apart en geeft semaphore "Kilnlog Client Memory Semaphore" vrij:
client (VC6) geeft periodiek opdracht aan de server om geheugen apart te zetten, als het geheugen apart gezet is, en dus de semaphore "Kilnlog Client Memory Semaphore" vrijgegeven is, wordt wat met het geheugen gedaan en wordt de semaphore "Kilnlog Server Client Memory" weer vrijgegeven, zodat het geheugen opnieuw apart gezet wordt, etc. Normaal zit er een timer functie tussen en alle handles worden netjes opgeruimd als de applicatie wordt afgesloten, maar dat is nu even niet van toepassing:
Zit er een enorme fout in deze code of hoe komt het verschil Debug/Release?
server (LabWindows) wacht tot semaphore "Kilnlog Server Memory Semaphore" wordt vrijgegeven, zet dan een stuk geheugen apart en geeft semaphore "Kilnlog Client Memory Semaphore" vrij:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| #include <windows.h> HANDLE hSemClientMem, hSemServerMem; int threadPool; void start (void) { createSemaphores(); CmtNewThreadPool (2, &threadPool); CmtScheduleThreadPoolFunction (threadPool, threadFunctionMem, NULL, NULL); } void createSemaphores (void) { hSemServerMem = CreateSemaphore (NULL, 1, 1, "Kilnlog Server Memory Semaphore"); hSemClientMem = CreateSemaphore (NULL, 1, 1, "Kilnlog Client Memory Semaphore"); } int CVICALLBACK threadFunctionMem (void *functionData) { while (endLog==0) { WaitForSingleObject (hSemServerMem, INFINITE); if (endLog==0) { // Zet geheugen klaar ReleaseSemaphore (hSemClientMem, 1, NULL); } } } |
client (VC6) geeft periodiek opdracht aan de server om geheugen apart te zetten, als het geheugen apart gezet is, en dus de semaphore "Kilnlog Client Memory Semaphore" vrijgegeven is, wordt wat met het geheugen gedaan en wordt de semaphore "Kilnlog Server Client Memory" weer vrijgegeven, zodat het geheugen opnieuw apart gezet wordt, etc. Normaal zit er een timer functie tussen en alle handles worden netjes opgeruimd als de applicatie wordt afgesloten, maar dat is nu even niet van toepassing:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| #include <windows.h> HANDLE hSemServerMem, hSemClientMem; void createSemaphores (void) { hSemServerMem = CreateSemaphore (NULL, 1, 1, "Kilnlog Server Memory Semaphore"); hSemClientMem = CreateSemaphore (NULL, 1, 1, "Kilnlog Client Memory Semaphore"); } int main (void) { createSemaphores(); signalServer(); while (checkSharedMem()) { waitServer(); // Doe wat signalServer(); } } bool waitServer (void) { switch (WaitForSingleObject (hSemClientMem, SERVER_TIMEOUT)) { case WAIT_OBJECT_0: // Alles goed break; case WAIT_TIMEOUT: // Fout break; } } void signalServer (void) { ReleaseSemaphore (hSemServerMem, 1, NULL); } |
Zit er een enorme fout in deze code of hoe komt het verschil Debug/Release?
[ Voor 11% gewijzigd door Verwijderd op 05-05-2004 21:19 ]