Seite 1 von 2
Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 11:07 am
von Kmitska
Hallo Leute,
ich würde gerne dies hier durchsetzen, aber wie?:
Die Klasse:
Code: Alles auswählen
class test{
public:
void* loadMails ( void* p );
test(){
pthread_t threadOne;
int i = pthread_create(&threadOne, NULL, loadMails, NULL); //Hier gibt's den Fehler!
}
};
Main:
Die Funktion:
Code: Alles auswählen
void* test::loadMails ( void* p )
{
while(true)
{
cout << "a" << endl;
}
}
Bekomme hier Fehlermeldungen, mit denen ich nichts anfangen kann:
Code: Alles auswählen
***\main.cpp|12|error: argument of type 'void* (test::)(void*)' does not match 'void* (*)(void*)'|
Danke im Voraus! :)
Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 11:22 am
von Bebu
Du übergibst hier eine Klassenfunktion und keine Normale Funktion, da ist die Syntax anders. Am besten kuckst du dir mal std::bind an. Ich habe das schon mal vor einiger Zeit hinbekommen, aber das ist lange her und ich habe den Code jetzt nicht rumliegen. Ist das für dein Mailprogramm? Gibt es nicht in wxWidgets eine passende Threadklasse? Warum benutzt du die Posixthreads?
Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 11:40 am
von Kmitska
Habe nun so etwas:
Code: Alles auswählen
void* loadMails ( void* p )
{
while(true)
{
cout << " aa " << endl;
Sleep(1000);
}
}
class test{
public:
friend void* loadMails(void* );
test(){
pthread_t threadOne;
int i = pthread_create(&threadOne, NULL, loadMails, this );
}
};
int main (void)
{
test tesT();
while(true){
cout << "b" <<endl;
Sleep(2000);
}
}
Leider wird hier mein Thread nicht aufgerufen, und als Parameter übergeb ich das Klasseobject! :-)
Wieso wird es denn hier nicht aufgerufen?
Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 12:18 pm
von Bebu
Dein Code enthält schon mal ein paar Seltsamkeiten. Wieso schickst du beide Threads in ein Endlosschleife? Wieso setzt du loadMails als friend in die Testklasse? Hast du schon mal was von pthread_join gehört? Ich versuche das mal bei mir zum laufen zu bekommen. Viel zu lernen du noch hast junger Padawan

Sleep2000? Du wartest 2000 Sekunden?
Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 12:35 pm
von Kmitska
Ja damit beide erwas machen und etwas ausgeben.

Und man kann nie genug lernen!
P.S. das sind 2000 mil. Sekunden

Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 12:48 pm
von Bebu
das kommt drauf an. sleep sind Sekunden. Usleep sind Milisekunden. Sleep so wie bei dir, kompiliert bei mir gar nicht. Ich bastle gerade noch an der Lösung. Aber jetzt muss ich in die Arbeit. Ich hasse diese Funktionspointer

Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 1:08 pm
von hofian
Ich denke er benutzt Windows, da gibt es Sleep (mit großem 'S').
Siehe
hier.
Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 1:34 pm
von cloidnerux
Problem gelöst, das Funktioniert bei mir(Rein Windows API):
Code: Alles auswählen
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
DWORD WINAPI MyThreadFunction( LPVOID lpParam );
void ErrorHandler(LPTSTR lpszFunction);
class test
{
private:
int i;
public:
static DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
int a = 0;
for(int a = 0; a < 100; a++)
std::cout << a << std::endl;
return 0;
}
void startThread()
{
DWORD dwThreadIdArray;
HANDLE hThreadArray;
hThreadArray = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
NULL, // argument to thread function
0, // use default creation flags
&dwThreadIdArray); // returns the thread identifier
}
};
int _tmain()
{
std::cout << "Hello World!" << std::endl;
test a;
a.startThread();
Sleep(10000);
return 0;
}
Du musst die Funktion, die du als Funktionsparameter übergeben willst als static definieren, wenn sie innerhalb der Klasse liegen soll. Diese kann dann alle anderen Klassenfunktionen aufrufen.
Sleep bekommt unter Windows die anzahl der Millisekunden und ist anscheinend nur in der WinAPI definiert.
Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 3:10 pm
von Kmitska
cloidnerux, weißt du auch wie man das mit Pthreads machen kann?
Immerhin sollte mein Programm für Windows und Linux verfügbar sein. :-)
Daher verwende ich auch Plattformunabhängige Sachen.
Re: Probleme mit ptrhead in Klassen
Verfasst: Do Apr 12, 2012 3:16 pm
von cloidnerux
Immerhin sollte mein Programm für Windows und Linux verfügbar sein.

Daher verwende ich auch Plattformunabhängige Sachen.
Du musst die Klassenfunktion statisch machen, dann geht alles seinen normalen weg:
Code: Alles auswählen
class test{
public:
static void* loadMails ( void* p );
test(){
pthread_t threadOne;
int i = pthread_create(&threadOne, NULL, loadMails, NULL); //Hier gibt's nun keinen Fehler mehr
}
};
Das Problem ist, dass du für Funktionspointer eine statische Addresse benötigst, da Klassen aber erst instanziert werden müssen, bevor deine Funktionen aufrufbar sind, da sie ja meistens von Klasseninternen Variablen abhängig sind, meckert der Compiler. Dies umgehst du mit dem "static", andererseits bedeutet dies aber auch, dass du innerhalb der statischen Funktion KEINEN Zugriff auf Klasseninterne Variablen hast.