[C] Multithread (thread klapt neer)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Ik zit met het volgende... wanneer ik de onderstaande code uitvoer dan klapt de thread van readKey steeds neer waardoor ik dus in feite niet meer de sleep kan beinvloeden bij de printLeds functie...

Iemand die me kan vertellen waardoor dit komt? Uiteraard heb ik natuurlijk wel multithread ondersteuning.

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdio.h>
#include <fcntl.h>
#include <windows.h>
#include <process.h>

int x = 1000;

void readKey(void *args) 
{
    char i;

    while (1) {
        i = getchar();

        if (i == '1')
            x += 20;
        else if (i == '2')
            x -= 20;
    }
}

void printLeds(void *args)
{
    int i, j;

    while(1) {
        j = 1;
        
        for(i = 1; i <= 11; i++) {
            printf("LED: %x\n", j);
            j <<= 1;
            Sleep(x);
        }
    }
}

int main(int argc, char **arv)
{
    if (_beginthread(printLeds, 0, NULL) != 0) {
        fprintf(stderr, "Error: creation of thread failed.");
        //exit(-1);
    }

    if (_beginthread(readKey, 0, NULL) != 0) {
        fprintf(stderr, "Error: creation of thread failed.");
        //exit(-1);
    }
    
    fflush(stdin);
    getchar();
    
    return 0;
}

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Euh :?
Wat is "neerklappen"? En "multithread ondersteuning"? En waar zit überhaupt je multithreaded code op _beginthread na?

En wat voor foutmelding krijg je? Heb je al gedebugged? Gezocht? Gevonden? Etc. etc. Vul je topic even aan graag, en dan het liefst conform onze Quickstart.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Lees ook eens de documentatie door van getchar.
Je moet namelijk enter duwen vooraleer je een karaketer zal kunnen uitlezen.

Hoe verwacht je trouwens dat de getchar() en fflush() in je main en de getchar() in readkey met elkaar overeen komen? wat verwacht je trouwens van je 2 threads wanneer de main() ten einde loopt?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(int argc, char **arv)
{
    if (_beginthread(printLeds, 0, NULL) != 0) {
        fprintf(stderr, "Error: creation of thread failed.");
        //exit(-1);
    }

    if (_beginthread(readKey, 0, NULL) != 0) {
        fprintf(stderr, "Error: creation of thread failed.");
        //exit(-1);
    }
    
    fflush(stdin);
    getchar();
    
    while(!ready)
    {
        sleep(1);
    }

    return 0;
}


Anders stoppen al je threads op het moment dat je bij return 0 komt!

[ Voor 7% gewijzigd door Matis op 23-04-2009 19:17 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
RobIII schreef op donderdag 23 april 2009 @ 18:49:
Euh :?
Wat is "neerklappen"? En "multithread ondersteuning"? En waar zit überhaupt je multithreaded code op _beginthread na?

En wat voor foutmelding krijg je? Heb je al gedebugged? Gezocht? Gevonden? Etc. etc. Vul je topic even aan graag, en dan het liefst conform onze Quickstart.
Neerklappen dat hij dus gewoon meteen uitvalt zeg maar :9, en multithread ondersteuning nvm dat was een domme opmerking inderdaad.

En me multithread code is natuurlijk die twee functies. Foutmelding krijg ik niet, enkel dat het dus niet lukte om de thread te creeeren.
H!GHGuY schreef op donderdag 23 april 2009 @ 19:01:
Lees ook eens de documentatie door van getchar.
Je moet namelijk enter duwen vooraleer je een karaketer zal kunnen uitlezen.

Hoe verwacht je trouwens dat de getchar() en fflush() in je main en de getchar() in readkey met elkaar overeen komen? wat verwacht je trouwens van je 2 threads wanneer de main() ten einde loopt?
Ja ik wist dat je op enter moest drukken en daardoor kwam het ook dacht ikzelf en dit had ik ook geprobeerd te omzeilen m.b.v.
C:
1
2
3
4
5
6
    while (1) {
        i = getchar();
    
        if (i == '3')
            break;
    }

voor de return te zetten alleen dat werkte ook niet. En wat ik verwachtte is dat de beide threads gewoon doorlopen, maar ik denk dat die worden afgebroken wanneer de main afsluit dus vandaar dat ik het bovenstaande foefje had geprobeerd.

En sorry voor me OP maar was net einde van de les dat ik topic plaatst :+

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Returnen uit main betekent idd een stoppende applicatie. In de runtime staat meestal zoiets als
C:
1
exit(main(argc, argv));

Oftewel, de returnwaarde van main is meteen de exit-code voor de exit functie.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Oke maar iemand dus een oplossing voor dit? Wat ik dus gewoon wil is dat wanneer ik op 1 druk de snelheid verlaagt en 2 de snelheid verhoogt... maar hoe zorg ik ervoor dus dat het programma en de thread waarbij ik de toets inlees niet meteen stoppen...?

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Maar van de fucntie die de toets leest geen thread, maar doe achter in in het hoofd programma.

gebruik
getch() om toets uit te lezen (heeft geen enter nodig geloof ik)

De x variable moet volatile zijn. (hoewel het zonder volatile mogelijk KAN werken)


Bedenk een methode (x=0 ofzo) om te zorgen dat de led thread afsluit.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Sloop de threads eruit en gebruik een non-blocking vorm om een keypress op the vangen ( dmv _kbhit() bv )

[ Voor 3% gewijzigd door farlane op 26-04-2009 20:26 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1