Hier ben ik weer, wederom met mailslots. Maar goed dat zullen de meesten wel niet snappen!
Ik probeerde het eerst met processes, maar ik dacht dat het met threads binnen 1 programma wat makkelijker zou zijn....
Goed, ik heb net de search gebruikt, maar daar vind je bijna niets over mailslots, evenmin in google of het wordt al snel TE uitgebreid. De bedoeling van mijn programma/oefening is dat er 3 threads worden opgestarts, eerst wordt er een A geprint, die vervolgens even aangeeft dat ie klaar is en dan kan er een B geprint worden die aangeeft dat ie klaar is en dan kan thread 3 een C printen die dan weer tegen thread1 vertelt dat hij weer een A mag printen enzetera.
Er staat een hoop commentaar in, maar dat is om te kijken of het al werkte met 1 thread. Nou niet dus!
Maar ik snap niet zo hoe dat kan, want je moet dus eerst de mailslots maken voor de threads, ik dacht ook dat de Readfile op de goeie plek stond. De fout zit em erin dat ik de threads niet laat doorgeven dat de volgende threads kan. En aangezien ik een beetje nieuw ben met mailslots (noch immer) snap ik maar half, half hoe dat werkt in de praktijk. In theorie moet de main een bericht in de slot plaatsen dat zegt welke thread er aan de beurt is, die threads die draaien constant dus die zouden op het goede moment moeten printen. Maar ik snap niet zo goed hoe ik die berichten zou moeten plaatsen en hoe ik die zou kunnen uitlezen zodat het zaakje een beetje werkt.....
Goed, ik heb net de search gebruikt, maar daar vind je bijna niets over mailslots, evenmin in google of het wordt al snel TE uitgebreid. De bedoeling van mijn programma/oefening is dat er 3 threads worden opgestarts, eerst wordt er een A geprint, die vervolgens even aangeeft dat ie klaar is en dan kan er een B geprint worden die aangeeft dat ie klaar is en dan kan thread 3 een C printen die dan weer tegen thread1 vertelt dat hij weer een A mag printen enzetera.
code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
| #include <windows.h>
#include <stdio.h>
DWORD WINAPI printA(VOID)
{
char buf[32];
while (1){
ReadFile(hSlot, buf, sizeof(buf), (LPDWORD)&dwRead, NULL);
if (buf[0] == 1){
printf("A\n");
Sleep(100);}
else return 0;
}
}
/*DWORD WINAPI printB( VOID )
{
char buf[32];
while (1){
ReadFile(hSlot, buf, sizeof(buf), (LPDWORD)&dwRead, NULL);
if (*(int*)lpParam == 2){
printf("B\n");
Sleep(100);}
else return 0;
}
}
DWORD WINAPI printC( VOID )
{
char buf[32];
while (1){
ReadFile(hSlot, buf, sizeof(buf), (LPDWORD)&dwRead, NULL);
if (*(int*)lpParam == 3){
printf("C\n");
Sleep(100);}
else return 0;
}
}*/
VOID main( VOID )
{
DWORD dwThreadIdA,dwThreadIdB,dwThreadIdC,dwWritten;
HANDLE hThreadA,hThreadB,hThreadC,hSlot1, hSlot2,hSlot3;
STARTUPINFO startup_info = {0};
PROCESS_INFORMATION pi = {0};
startup_info.cb = sizeof startup_info;
//int dwWhichThread = 2;
//connect to mailslots
hSlot1 = CreateFile("\\\\.\\mailslot\\slot1",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
printf("Slot1 gemaakt\n");
/*hSlot2 = CreateFile("\\\\.\\mailslot\\slot2",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
printf("Slot2 gemaakt\n");
hSlot3 = CreateFile("\\\\.\\mailslot\\slot3",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
printf("Slot3 gemaakt\n");*/
//creating threads
hThreadA = CreateThread(NULL,0,printA,&dwWhichThread,0,&dwThreadIdA);
if (hThreadA == NULL) {printf("mislukt");}
else {printf("dwThreadIdA = %d", *(DWORD*)dwThreadIdA);}
/*hThreadB = CreateThread(NULL,0,printB,&dwWhichThread,0,&dwThreadIdB);
if (hThreadB == NULL) {printf("mislukt");}
else {printf("dwThreadIdB = %d", *(DWORD*)dwThreadIdB);}
hThreadC = CreateThread(NULL,0,printC,&dwWhichThread,0,&dwThreadIdC);
if (hThreadC == NULL) {printf("mislukt");}
else {printf("dwThreadIdC = %d", *(DWORD*)dwThreadIdC);}*/
//closing handles
if (CloseHandle(hThreadA) == 0)
printf("CloseHandleA Error\n");
/*if (CloseHandle(hThreadB) == 0)
printf("CloseHandleB Error\n");
if (CloseHandle(hThreadC) == 0)
printf("CloseHandleC Error\n");*/
CloseHandle(hSlot1);
/*CloseHandle(hSlot2);
CloseHandle(hSlot3);*/
} |
Er staat een hoop commentaar in, maar dat is om te kijken of het al werkte met 1 thread. Nou niet dus!
Maar ik snap niet zo hoe dat kan, want je moet dus eerst de mailslots maken voor de threads, ik dacht ook dat de Readfile op de goeie plek stond. De fout zit em erin dat ik de threads niet laat doorgeven dat de volgende threads kan. En aangezien ik een beetje nieuw ben met mailslots (noch immer) snap ik maar half, half hoe dat werkt in de praktijk. In theorie moet de main een bericht in de slot plaatsen dat zegt welke thread er aan de beurt is, die threads die draaien constant dus die zouden op het goede moment moeten printen. Maar ik snap niet zo goed hoe ik die berichten zou moeten plaatsen en hoe ik die zou kunnen uitlezen zodat het zaakje een beetje werkt.....