Permalänk
Medlem

pthread problem

Hej
Jag har nu suttit ett tag och försökta att följa diverse tutorials och dylikt, men kan inte få "pthread_create" att fungera.
Jag är väl medveten om att argumentet behöver bara ev en pekartyp och har prövat med tex (void*) <char pekare> men får samma fel, även med med int pekare. Vad är det som jag gör fel?
PingThread.cpp|34|fel: argument av typen "void* (PingThread::)()" matchar inte "void* (*)(void*)"|

Headern: http://pastebin.com/LsmATnbi
Cpp filen: http://pastebin.com/LCiLfeUE

Visa signatur

[i]Those who don't understand UNIX are condemned to reinvent it, poorly. – Henry Spencer [/i]
[i]“Programmers are in a race with the Universe to create bigger and better idiot-proof programs,
while the Universe is trying to create bigger and better idiots.
So far the Universe is winning.”
[/i]

Permalänk
Medlem

Du försöker skicka med en icke-statiskt medlemsfunktion, vilket inte kommer att fungera då en icke-statiskt medlemsfunktion är thiscall och måste anropas med ett objekt.
Det man ska skicka med är en pekare till en "void * func(void *)" funktion, ifall du vill använda en klass funktion så måste den vara statiskt.

Trådstöd i C++ infördes i C++11, så man behöver inte använda ett externt bibliotek som pthreads. Det finns diverse tutorials online om detta, t.ex:
http://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutori...

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem
Skrivet av MagnusL:

Du försöker skicka med en icke-statiskt medlemsfunktion, vilket inte kommer att fungera då en icke-statiskt medlemsfunktion är thiscall och måste anropas med ett objekt.
Det man ska skicka med är en pekare till en "void * func(void *)" funktion, ifall du vill använda en klass funktion så måste den vara statiskt.

Trådstöd i C++ infördes i C++11, så man behöver inte använda ett externt bibliotek som pthreads. Det finns diverse tutorials online om detta, t.ex:
http://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutori...

Tackar ypperligt för detta svar! En annan mindre fin lösning som jag hittat var:

void PingThread::start(){
pthread_create(&thread, 0, convertAndRun, this);
}
void PingThread::joinThread() {
pthread_join(thread, NULL);
}
void* PingThread::convertAndRun(void* arg) {
PingThread* t = reinterpret_cast<PingThread*>(arg);
t->PingThread::joinThread()
t->PingThread::run();
pthread_exit(0);
}
void PingThread::run(){
}

Med noten att convertAndRun() måste deklareras som "static void*" i headern.
Men din lösning verkar klart bättre

En varning för MINGW kompilerare: MINGW inte har stöd för bibleoteket "threads" ifrån C++11 standarden. För detta så använd något annat bibleotek.
g++ i linux fungerar däremot utmärkt med threads.

Visa signatur

[i]Those who don't understand UNIX are condemned to reinvent it, poorly. – Henry Spencer [/i]
[i]“Programmers are in a race with the Universe to create bigger and better idiot-proof programs,
while the Universe is trying to create bigger and better idiots.
So far the Universe is winning.”
[/i]