|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.
| |
|
|