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.
Annonceindlæg fra DE-CIX
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.
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.
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?
25. september 2004 - 13:35
#5
Du kalder CreateThread med en dispatcher funktion og this. Dispatcheren kalder så din metode.
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; }
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)
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; }
25. september 2004 - 14:32
#9
Retter; DU har fået det til at virke ;) Smid lige et svar...
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.
25. september 2004 - 14:34
#11
svar
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
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.
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.
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 ?
25. september 2004 - 15:15
#16
Hov opretter lige et nyt ? når jeg når til alternativer til threading. :)
Kurser inden for grundlæggende programmering