Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C++] Threading

Pagina: 1
Acties:

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 14-11 20:05
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
bool setListening()
{
    listeningThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ListeningThread(),0,0,NULL);
    if (listeningThread != INVALID_HANDLE_VALUE)
    {
     return true;
    }
    else
    {
     CloseHandle(listeningThread);
     return false;
    }
}

Deze start een thread op, welke de methode "ListeningThread()" uit zou moeten voeren:
C++:
1
2
3
4
unsigned long WINAPI ListeningThread()
{
    //Allemaal dingen die heel lang duren
}


De methode setListening() roep ik vanuit mijn main aan.
C++:
1
2
3
4
5
6
7
8
9
10
int main()
{
    Console::WriteLine(GetCurrentThreadId().ToString());
    UsbReader* r = new UsbReader();
    r->setListening();
    while(true)
    {
        Console::WriteLine("Main thread");
    }
}

Nu is het probleem dat de thread die ik aanmaak, alsnog in dezelfde thread loopt als mijn main. Hier ben ik achtergekomen door de ThreadId's te vergelijken.
Zou iemand mij kunnen vertellen waarom deze thread alsnog in de main thread loopt?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hint: een functie-pointer is niet hetzelfde als een functie-aanroep ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 14-11 20:05
Daar had ik ook naar gekeken, in elk voorbeeld staat het zonder (). Haal ik deze weg dan krijg ik
code:
1
'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE


En haal ik de cast weg
code:
1
function call missing argument list; use '&UsbReader::ListeningThread' to create a pointer to member


En ik kan nergens vinden hoe ik zorg dat dit wel werkt. (Heb uren gegoogled)

[ Voor 20% gewijzigd door DoDo op 21-10-2008 02:13 ]


Verwijderd

De functie waar je naar refereert is blijkbaar een member functie, en die kan je dus niet gebruiken als callback functies, enkel losse functies of static member functies.

[ Voor 9% gewijzigd door Verwijderd op 21-10-2008 02:28 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Idd. Je zult een losse functie moeten maken. Je kunt uiteraard wel gebruik maken van "lpParameter" in CreateThread(). Als je de documentatie goed gelezen had dan had je ook gezien dat je thread functie óók een parameter genaamd "lpParamater" heeft. Je kunt middels CreateThread dus data aan je thread meegeven. Typisch is dat een pointer naar je object, zodat je vanuit de losse ListeningThread() een ListeningThread() op de instance aan kunt roepen.

Overigens:
DoDo schreef op dinsdag 21 oktober 2008 @ 02:12:
Daar had ik ook naar gekeken, in elk voorbeeld staat het zonder ().
Dit had je natuurlijk al een hint moeten geven dat er iets niet in de haak is. Je code net zo lang aanpassen tot het compileert is allesbehalve een goede manier om software te ontwikkelen, dus ik kan je sterk afraden dit ooit weer te doen. Bovendien had het voor ons ook een stuk zinniger geweest als je direct die compile error liet zien. Overigens staat het hier goed uitgelegd: http://www.parashift.com/.../pointers-to-members.html (die hele FAQ is sowieso wel een aanrader)

[ Voor 42% gewijzigd door .oisyn op 21-10-2008 02:34 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 14-11 20:05
Allereerst bedankt, ik kan nu de code in een andere thread uit laten voeren. Maar dit zou dus betekenen dat de code die uitgevoerd moet worden niet private kan zijn in een klasse, of heb ik dit nu fout? Aangezien je een reference meegeeft naar het object, en het vanuit het object zelf aanroept?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zolang je zorgt dat de wrapper functie die de daadwerkelijke private functie aanroept op de klasse toegang heeft tot die klasse is er niets aan de hand. Je kunt daarvoor zorgen door die wrapper een static te maken van die klasse, of door de functie als friend toe te voegen aan de klassedefinitie.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Beter gezegd: die static member zelf mag ook private zijn, want het is nog steeds een member.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1