Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » KDevelop / Qt / wxWidget » pthread_create

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
26.08.2003, 10:16 Uhr
~bussibär
Gast


hallo leute!

hab folgendes problem:

ich hab ein projekt mit qt-designer gemacht, das klappt ganz gut. jetzt möchte ich die funktion
pthread_create benutzen.

die funktion ist ja so aufgebaut:


C++:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine)(void*), void *arg);


ich hab mir eine variable definiert und möchte der funktion eine funktion, d.h einen slot übergeben. doch die soll als parameter void * und als rückgabewert void * haben.

leider kann ich beim einrichten eines slots nur void und nicht void * angeben.

deshalb kommen beim aufruf der funktion compilerfehler "cannot convert..."

eine eigene klasse erstellen geht auch nicht, weil dann die steuerelemente nicht bekannt sind.


Habt ihr eine Lösungsidee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.08.2003, 10:17 Uhr
~bussibär
Gast


eine eigene funktion meinte ich
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.08.2003, 13:37 Uhr
~bussibär
Gast


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.08.2003, 14:48 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich kenne mich weder mit QT noch mit KDE aus. Folglich kann Ich Dir nicht helfen, wenn es ein "Slot" Spezifisches Problem ist. Ich weiß nämlich noch nicht mal was ein Slot ist, hört sich aber schweinisch an.

Was pthread_create angeht kann ich Dir vielleicht schon eher helfen: Das startet ja einen Thread, wobei du neben dem Eintrittpunkt zu diesem Thread noch ein völlig (sinn)freies Argument mitlieferst.
Startest Du also Deinen Thread mit

C++:
void* data
pthread_create(deine_thread_function, data);


So wird der Thread deine_thread_function ausführen, wobei data als Parameter mitgelifert wird. Normalerweise wird man nun - zumindestens wenn wir über C++ reden - versuchen, letztlich nicht eine Funktion, sondern eine Methode eines Objekts aufzurufen. Der wesentliche Gedanke ist dann, daß man der Threadfunktion einen Pointer auf das Objekt übergibt und die Threadfunktion nichts anderes macht, als die Methode aufzurufen.

Eine rudimentäre Threadklasse sieht damit etwa so aus (ich verzichte mal auf Fehlerbehandlung, um es komprimiert darzustellen):

C++:
class Thread
{
private:
    // Ein kleiner Helper
    static void* CallbackForPthread(void* pthis)
    {
         Thread* pthrd = reinterpret_cast<Thread*>(pthis);
         return pthrd->run();
    }
protected:
    // Diese Methode wird im Thread ausgeführt, in abgeleiteteten Klassen
    // zu implementieren; hier nur abstract
    virtual void* execute() = 0;

public:
    // Diese Methode wird benutzt, um den Thread zu starten
   void start() { pthread_create(&Thread::CallbackForPthread, this); }
};



Anwenden kann man das dann so:

C++:
class DeinThread: public Thread
{
protected:
    virtual void* execute() { /* Dein Code */ }
};

int main()
{
    DeinThread thrd;

    thrd.start(); // Starte Thread
    ...
}



Da der ganze Kram nun in einer Klasse ist, kannst es problemlos mit anderen Klassen kombinieren -wahlweise über aggregation oder mehrfachvererbung.

Ist das etwa die Richtung, die du brauchst, oder habe ich dich "vermißverstanden"?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 26.08.2003 um 14:49 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.08.2003, 14:51 Uhr
~bussibär
Gast


vielen dank für deine hilfe! es geht aber eher um die slot geschichte, weil wenn ich einen slot (funktion) erschaffe mit dem designer, ich ihn nicht mit returntyp void * bestimmen kann, was ja verlangt ist, sondern mit nur mit void.

grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.08.2003, 09:12 Uhr
~bussibär
Gast


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.08.2003, 10:42 Uhr
0xdeadbeef
Gott
(Operator)


Zur Not schreib dir halt ne Funktion

C++:
void *slot_invoker() {
  my_slot();
  return NULL;
}


und übergib die an pthread_create.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.08.2003, 11:00 Uhr
~bussibär
Gast


hab ich schon probiert, aber in der funktion ist dann leider der slot nicht bekannt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.08.2003, 11:28 Uhr
virtual
Sexiest Bit alive
(Operator)


Eigentlich hast Du nur ein cast Problem: beim Aufruf von pthread_create caste den Typen der Funktion (des Slots) so, daß es passt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.08.2003, 11:32 Uhr
0xdeadbeef
Gott
(Operator)


Dann verbinde dir ein Signal mit dem Slot und gib eine Funktion an den Thread weiter, der das Signal triggert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ KDevelop / Qt / wxWidget ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: