Avatar billede LvM Nybegynder
22. januar 2012 - 17:33 Der er 7 kommentarer og
1 løsning

Simpel Win32 threading

Hej,

Jeg sidder for første gang med threading i Win32 gennem C++. Jeg har sammensat en meget enkel procedure hvis formål er at overvåge og læse indholdet af en csv-fil og udskrive dette til console. Koden virker som sådan efter hensigten, men problemet er imidlertid, at processen bruger en meget stor del af min cpu, hvorfor jeg må inferere, at noget er galt :)
Nedenfor ses min simple kode - hvad gør jeg forkert, og hvad bør jeg rent faktisk gøre i stedet? (jeg er klar over, at jeg mangler oprydning, men jeg regner ikke med at dette har en umiddelbar indflydelse)

Tak for hjælpen.

int main(int argc, char *argv[])
{
    StartFunc();
}


void StartFunc(void)
{
    int i = 0;
    do
    {
        if(i == 0)
        {
            _beginthread(ThreadProc, 0, NULL);
            i = 1;
        }
    } while(1 == 1);
}


void ThreadProc(void *arg)
{
    do
    {
        MyFile = fopen(file, "r");
        fgets(readStr, 10, MyFile);
        fclose(MyFile);
        std::cout << "\r" << readStr << "\r";
        Sleep(500);
    } while(1 == 1);
}
Avatar billede LvM Nybegynder
22. januar 2012 - 17:34 #1
Jeg har desuden blot skrevet do while{1 == 1} da jeg blot vil overvåge filens indhold så længe jeg ikke manuelt afbryder processen.
Avatar billede arne_v Ekspert
22. januar 2012 - 17:39 #2
StartFunc futter bare der ud af

erstat den do while med noget som laeser input fra tastatur
Avatar billede bertelbrander Praktikant
22. januar 2012 - 17:41 #3
Jeg tror det er StartFunc der æder al tiden, prøv at indsætte en Sleep i dens loop.
Avatar billede LvM Nybegynder
22. januar 2012 - 17:47 #4
Hej Arne,

Det virker, mange tak for hjælpen. Jeg har blot kopieret herfra for at få det til at virke som du antyder:
http://msdn.microsoft.com/en-us/library/esszf9hw(v=vs.80).aspx

Jeg er dog usikker på om jeg forstår, hvorfor netop dette virker og ikke mit oprindelige eksempel ikke gør - begge kører vel derudad så længe konditionen i do while-løkken er overholdt, og det er den i begge eksempler. Har du indsigt heri du kan dele?

Igen tak for hjælpen.
Avatar billede LvM Nybegynder
22. januar 2012 - 17:51 #5
Den nye StartFunc ser således ud:

void StartFunc(void)
{
    int        KeyInfo;

    do
    {
        KeyInfo = _getch();
        if ( tolower( KeyInfo ) == 'a' &&
            ThreadNr < 32 )
        {
            _beginthread(ThreadProc, 0, NULL);
        }
    } while( tolower( KeyInfo ) != 'q' );
}
Avatar billede arne_v Ekspert
22. januar 2012 - 17:54 #6
getch venter - din gamle loop koerte bare der ud af
Avatar billede LvM Nybegynder
22. januar 2012 - 17:56 #7
OK, det giver mening. Smid et svar! Tak for hjælpen!
Avatar billede arne_v Ekspert
22. januar 2012 - 17:59 #8
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester