Toon posts:

[c++] Threads & Mailslots

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hier ben ik weer, wederom met mailslots. Maar goed dat zullen de meesten wel niet snappen! :P 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.

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.....

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
Hey,

Klinkt interessant :)
misschien heb je hier iets aan:
http://www.codeguru.com/C...enance/article.php/c4457/

Moet je hier niet een scheduler voor maken trouwens?
Als je een signaal naar een thread stuurt, kan deze hem uitlezen en dan toch
een actie ondernemen(of zit ik hier heel ver de plank mis te slaan?)

Laat de scheduler wachten op een antwoord en zodra deze het antwoord heeft, kan de scheduler weer verder met de volgende actie.

Deze scheduler zou dan de signalen op de juiste momenten naar de juiste threads kunnen sturen en dan heb je toch je probleem al opgelost?

Trouwens, het valt me op dat je netjes voor alle threads een slot aanmaakt, maar deze threads niet op de hoogte stelt van hun slot......

[ Voor 65% gewijzigd door 0528973 op 16-03-2004 17:28 ]

Pascal