Anzeige:
Ergebnis 1 bis 6 von 6

Thema: (c++) pthread_create

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.02.2004
    Beiträge
    10

    Question (c++) pthread_create

    Hallo

    Prizipiell weiss ich wie man mit Threads umgeht, aber ich würde gerne wissen, ob es nicht eleganter geht. Ich beschreibe einfach mein Problem mit zwei Beispiel Codestücken.
    So läuft es
    Code:
    void * threadFunk(void * argp)
    {
      ((A*) argp)->funk();
    }
    
    class A {
      public:
        pthread_t t;
    
         void funk() {
           ...
         }
    
        void classFunk() {
          pthread_create(&t, NULL, threadFunk, this);
        }
    };
    Ich finde die global definierte Funktion aber nicht wirklich schön. Ich hätte lieber so was wie
    Code:
    class A {
      public:
        pthred_t t;
    
        void * funk(void * argp) {
           ...
        }
        
        void classFunk() {
          pthread_create(&t, NULL, funk, NULL);
        }
    };
    Leider meckert bei mir der Compiler, dass im das dritte Argument nicht schmeckt. Kennt jemand einen Workaround oder eine andere Lösung?

    Gruss

  2. #2
    Registrierter Benutzer Avatar von oracle2025
    Registriert seit
    18.03.2002
    Beiträge
    136
    Du must vermutlich immer eine Funktion ausserhalb der Klasse angeben, da eine Funktion innerhalb einer Klasse intern noch einen Zusätzlichen Parameter bekommt, nämlich den "this" Pointer:

    Code:
    void * funk( A * this, void * argp);
    Die Lösung die du da hast, ist IMHO immer noch die Beste.
    Niemand dringt hier durch und
    gar mit der Botschaft eines Toten.
    Du aber sitzt an Deinem Fenster und
    erträumst sie Dir, wenn der Abend kommt.

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich hab hier (ich glaube im Forum tutorials&tricks) einen Beitrag zum Thema C Callbacks gepostet.

    Kurzfassung:
    static Methode, darin das Kontext Argument casten und Zielmethode aufrufen.

    Edit: http://www.mrunix.de/forums/showthread.php?t=38966

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Entweder verwende boost threads oder mach's so:

    Code:
    class Thread {
    public:
       Thread() {}
       virtual ~Thread() {}
    
       virtual void run() = 0;
    
       void start() {
          pthread_create(&trd, NULL, starter, this);
       }
    
       void kill(int sig) {
          pthread_kill( trd, sig );
       }
    
       void * join() {
          void * reply = NULL;
    
          pthread_join( trd, &reply );
    
          return reply;
       }
    
    // ...
    
    protected:
       pthread_t trd;
    
       static void * starter(void * ptr) {
          Thread * ptrd = (Thread*)ptr;
    
          ptrd->run();
          pthread_exit(NULL);
    
          return NULL;
       }
    };
    (Wobei hier garkein Errorhandling drinn is.)

    Und dann leit' dir ne Klasse ab, wobei du run() überlädst.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    [...]Leider meckert bei mir der Compiler, dass im das dritte Argument nicht schmeckt. Kennt jemand einen Workaround oder eine andere Lösung?
    Das ist eine FAQ:
    http://www.parashift.com/c++-faq-lit...o-members.html

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.02.2004
    Beiträge
    10

    Thumbs up

    Danke Jungs

    Ich hab mich an den Vorschlag von anda_skoa gehalten und jetzt funktioniert es. In Zukunft werde ich sowas bestimmt noch schöner gestalten, aber so ist das halt, wenn man im Nachhinein solche Dinge noch einbauen muss. Ich bin sicher ihr kennt das Problem.

    Gruss

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •