Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » pthreads, SharedObjects und abgeleitete Klassen

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 <
000
12.08.2009, 23:19 Uhr
FunnyDingo



Hallo zusammen,

also meine Frage ist schon etwas knifflig und ich hoffe ich kann es verständlich erklären.

Meine Anwendung lädt via dlopen SharedObjects dynamisch nach. Diese sollen in einem eigenen Thread laufen. Bisher müssen die Module sich selber darum kümmern in einem Thread zu laufen und ich wollte das nun so modifizieren, dass die Module nicht mehr so viel machen müssen. Dazu habe ich den Code zum erstellen der Threads in die Basis-Klasse gesteckt. Resultat: die Module starten nicht mehr.


C++:
class CBase
{
    private:
        pthread_t listenThread;
        pthread_t sendThread;
        pthread_cond_t threadCondition;
        pthread_mutex_t threadMutex;

    protected:
        ipcQueue<yac::npm::CRequest*> *workerQueue;

    public:
        CBase(std::string, ipcQueue<yac::npm::CRequest*> *);
        virtual ~CBase();
        static void *startListen(void *);
        virtual void listen() {};
        static void *startSend(void *);
        virtual void send() {};
        void awake();
};

Wichtig sind hier startListen() und startSend(). Ich nehme mal den Code aus startListen, da beide vom Aufbau identisch sind:

C++:
void *CBase::startListen(void *obj)
{
    LOG_DEBUG("yac::npm::CBase", "Try to call listen()");
    CBase *tmp = (CBase*)obj;
    if(tmp != NULL)
        tmp->listen();
    else
        LOG_DEBUG("yac::npm::CBase", "Sorry, tmp is NULL :-(");
    return NULL;
}

Ich habe gerade den Eindruck, dass nur listen()/send() aus der Basis-Klasse ausgeführt werden (ich bekomme nicht die Meldung "Sorry, tmp is NULL"). Aber da listen() und send() virtual sind, müssten doch trotzdem die abgeleiteten Methoden ausgeführt werden, oder?

Wo ist hier mein (Denk-)Fehler?

lg,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.08.2009, 17:20 Uhr
0xdeadbeef
Gott
(Operator)


Damit so eine Rückverbindung funktionieren kann, muss das Hauptprogramm die relevanten Symbole dynamisch exportieren - insbesondere die vtables. Füg beim Kompilieren des Programms mal die Option -Wl,-E dazu (das reicht -E an den Linker durch). Lies dir außerdem die ld-Manpage durch, insbesondere den Teil über die --dynamic-list-Optionen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.08.2009, 17:40 Uhr
FunnyDingo



OK *man ld* Danke!
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.09.2009, 22:07 Uhr
FunnyDingo



Ups... Ich hatte dieses Problem schon verdrängt *g* aber man kommt ja nicht drum herum.

Leider hilft das alles nicht. Ich glaube aber, den Fehler gefunden zu haben:

C++:
CBase::CBase(.....) {
if (pthread_create(&listenThread, NULL, startListen, this) != 0)
    FATALEXCEPTION("Can't create listen thread for NPM '" + npmName + "!");
}
....
void *CBase::startListen(void *obj)
{
    LOG_DEBUG("yac::npm::CBase", "Try to call listen()");
    CBase *tmp = (CBase*)obj;
    if(tmp != NULL)
        tmp->listen();
    else
        LOG_DEBUG("yac::npm::CBase", "Sorry, tmp is NULL :-(");
    return NULL;
}


Kann es sein, dass der this-Zeiger in einer Basis-Klasse auch "nur" auf die Basis-Klasse zeigt?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 12.09.2009 um 22:08 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.09.2009, 22:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wenn deine listen-funktion nicht virtuell ist isses klar.

ansonsten, benutz besser mal nen dynamic_cast statt dem ollen C-Cast, evtl schmeißt dir der compiler sonst was weg
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.09.2009, 14:25 Uhr
FunnyDingo



listen() war virtuell.

Aber es spielt nun keine Rolle mehr. Ich habe gestern noch mal über Logik des Codes nachgedacht und festgestellt, dass es völlig blödsinnig ist, das erstellen der Threads in die Basis-Klasse zu packen, da ich gar nicht weiß, wieviele Threads das jeweilige Modul benötigt. Das Beispiel Modul brauch nun zwei, aber ein anderes könnte ja auch mit einem Auskommen oder brauch vielleicht sogar mehr als 2.

Hab den Code nun wieder in die abgeleitete Klasse gepackt. Trotzdem danke für die Hilfe
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: