/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Borland Builder 'CreateThread' spørgsmål ?
Fra : Thomas Jensen


Dato : 05-01-03 15:24

Hej.

Jeg har nogle problemmer med at oprette en tråd i borland builder, når jeg
starter en tråd som understående, altså constructoren køres kommer den
aldrig længere ind til CreateThread, den efterfølgende linie
SetThreadPriority bliver aldrig kørt. Hvis jeg fjerne while(1) løkken i
Thread for jeg en error når programmet startes. Er der nogen der ved hvad
jeg gør forkert, og evt. kan hjælpe mig hermed ?

P.s jeg ville fortække at anvende API kald og helst ikke TThread (Borlands
ejen).


cLinkControl::cLinkControl(void)
{
mThreadHandle= CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)cLinkControl::Thread(NULL), (LPVOID)this, NULL,
(LPDWORD) &ThreadId);
SetThreadPriority(mThreadHandle, THREAD_PRIORITY_LOWEST);
}


DWORD WINAPI cLinkControl::Thread(void* pThis)
{
while(1){
Sleep(1000);
}
}


På forhånd tak



 
 
Helge Jensen (05-01-2003)
Kommentar
Fra : Helge Jensen


Dato : 05-01-03 16:35

Thomas Jensen wrote:
> Hej.

Hej,

> mThreadHandle= CreateThread(NULL, 0,
> (LPTHREAD_START_ROUTINE)cLinkControl::Thread(NULL), (LPVOID)this, NULL,
> (LPDWORD) &ThreadId);

Hvad er det du har gang i?

Jeg går ud fra, at cLinkControl::Thread er en statisk metode?

(LPTHREAD_START_ROUTINE)cLinkControl::Thread(NULL)

hmmm.... kald cLinkControl::Thread med argument "NULL" (du burde nok
skrive 0, da det jo er C++).

Det terminerer jo netop ikke med din impl. af cLinkControl::Thread, når
du har et while(1) loop. Hvliket forklarer opførslen du observerer.

CreateThread tager en funktion(s-pointer) og argumentet til den funktion
som argument, så mon ikke hellere du vil:

static DWORD WINAPI my_thread_function(void *acLinkControl) {
cLinkControl* self = dynamic_cast<cLinkControl*>(acLinkControl);
// do stuff, i.e.
self->thread_run();
return 0;
}

og så:

cLinkControl::cLinkControl() {
mThreadHandle = CreateThread(0, 0,
my_thread_function, this,
            &ThreadId);
SetThreadPriority(mThreadHandle, THREAD_PRIORITY_LOWEST);
}

cLinkControl::thread_run() {
// code that needs to run in thread.
}


Helge Jensen (05-01-2003)
Kommentar
Fra : Helge Jensen


Dato : 05-01-03 16:54

BTW: har du tænkt over, hvad der skal ske med exceptions der kastes i
tråden, men ikke fanges?

Den oplagte semantik er, at invokere unexpected, noget i stil med:

static DWORD WINAPI thread_starter(
   DWORD WINAPI (*f)(void *),
void *arg) throw() {
// the throw() declaration should make sure
// that unexpected is invoked when an uncaught exception passes
// out through f
return f(arg);
}

static DWORD WINAPI thread_function(void *arg) {
// do stuff that needs to run in thread
}


Thomas Jensen (05-01-2003)
Kommentar
Fra : Thomas Jensen


Dato : 05-01-03 17:19

Hej igen.

Jeg ville bare sige mange tak for den hurtige hjælp, dog kunne jeg ikke lige
umiddlebart få din kode til at virke, men det vigtigste var idéen, så efter
lidt små modificationer ja så spiller det maks..

Med venlig hilsen

Thomas.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste