Avatar billede lemon Nybegynder
25. september 2004 - 12:29 Der er 15 kommentarer og
1 løsning

Hvilken .a/.lib fil til hvilken .h fil samt et ? om threading

2 fluer med et smæk:

1) Skal jeg linke til en .a fil hvis jeg bruger #include <windows.h> og hvor finder jeg ud af hvilke .a filer der kræves til de forskellige .h filer?

2) I min foo klasse har jeg to funktioner:

void foo::StartReceiveing();
{
    HANDLE hThread;
    hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ReceiveProcess, NULL, 0, NULL);
}
void foo::ReceiveProceses()
{
    //En masse kode.
}

Jeg får en "argugment type 'void (foo::)()' does not match 'DWORD (*)(void*)'" fejl ved compiling, men aner ikke hvad det betyder - help plz.
Avatar billede arne_v Ekspert
25. september 2004 - 12:57 #1
Det er forskelligt. Nogle libs finder den selv. Andre skal eksplicit angives.
Det fremgår af MSDN hvilke lib en given funktion er i.
Avatar billede arne_v Ekspert
25. september 2004 - 12:58 #2
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp

for CreateThreader siger nederst:

Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

Og du linker uden tvivl mod kernel32.lib/a
Avatar billede arne_v Ekspert
25. september 2004 - 12:59 #3
Fejlen mener jeg skyldes at du forsøger at kalde med en metode i din
klasse og ikke med en C style funktion.
Avatar billede lemon Nybegynder
25. september 2004 - 13:19 #4
Hmm ja det kører i hvert tilfælde fint når jeg smider funktionerne udenfor min klasse. Er det slet ikke muligt at starte en thread med en funktion fra en klasse? Er der alternativer?
Avatar billede arne_v Ekspert
25. september 2004 - 13:35 #5
Du kalder CreateThread med en dispatcher funktion og this. Dispatcheren kalder
så din metode.
Avatar billede arne_v Ekspert
25. september 2004 - 13:44 #6
Eksempel:

#include <iostream>

using namespace std;

#include <windows.h>

DWORD __stdcall dispatcher(void *p);

class X
{
    private:
        int v;
    public:
    X(int v) { this->v = v; };
    void Doit() { cout << v << endl; };
    void Start() { HANDLE h = CreateThread(NULL,0,dispatcher,this,0,NULL);
                  WaitForSingleObject(h,INFINITE); }
};

DWORD __stdcall dispatcher(void *p)
{
    X *x = (X *)p;
    x->Doit();
    return 0;
}

int main()
{
    X *x = new X(123);
    x->Start();
    return 0;
}
Avatar billede lemon Nybegynder
25. september 2004 - 14:23 #7
Hmm, jo...

Så vidt jeg kan se sker der så følgende i?

main, laver en ny X og kalder x.start.

x.start kalder dispatcher som en thread - parser den så "this" til (void *p) ?

dispatcher "caster" p til X *x og eksekverer doit, mens x.start venter på at h/dispatcher skal blive færdig.

dispatcher bliver færdig og x.start returnerer eksekveringen til main.

Er det omtrent korrekt og er det virkeligt "this" der bliver parset til dispatcher? (for så tror jeg godt jeg har fattet hvordan jeg skal kode det)
Avatar billede lemon Nybegynder
25. september 2004 - 14:31 #8
Jeg har fået det til at virke, men fatter stadig ikke hvad der sker mellem:

HANDLE h = CreateThread(NULL,0,dispatcher,this,0,NULL);

og

DWORD __stdcall dispatcher(void *p)
{
    X *x = (X *)p;
    x->Doit();
    return 0;
}
Avatar billede lemon Nybegynder
25. september 2004 - 14:32 #9
Retter; DU har fået det til at virke ;) Smid lige et svar...
Avatar billede arne_v Ekspert
25. september 2004 - 14:34 #10
CreateThread
  3. argument = funktion der kaldes
  4. argument = det eneste argument som funktionen kaldes med

Så Start kalder dispatcheren med et argument til sig selv således
at dispatcheren kalde Doit metoden på objektet.
Avatar billede arne_v Ekspert
25. september 2004 - 14:34 #11
svar
Avatar billede lemon Nybegynder
25. september 2004 - 14:43 #12
Kæft det er smart. Vil lige se om jeg ikke selv kan lave en thread-thingy class som kan tage en funktion (i en class) og lave en thread til den, så jeg slipper for at skrive mere end éen dispatcher.

Tak Arne :D
Avatar billede bertelbrander Novice
25. september 2004 - 14:51 #13
Man kan lave dispatcher som en static member af class'en, men man kan ikke bruge en ikke-static member som tråd function.
Avatar billede arne_v Ekspert
25. september 2004 - 14:57 #14
Det er ikke helt nemt at lave noget smart der.

En static metode er stort set det samme som en funktion. Men den kan jo puttes
pænt ind i den klasse hvor den hører til.
Avatar billede lemon Nybegynder
25. september 2004 - 15:02 #15
Mjae, jo *kradser sig i hovedbunden* Det var måske alligevel det letteste. Er der i øvrigt et alternativ til threads når man eks. skal modtage noget fra winsock mens man laver en masse andet ?
Avatar billede lemon Nybegynder
25. september 2004 - 15:15 #16
Hov opretter lige et nyt ? når jeg når til alternativer til threading. :)
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
Kategori
Kurser inden for grundlæggende programmering

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