Probleme mit ptrhead in Klassen

Schnelle objektorientierte, kompilierende Programmiersprache.
Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Probleme mit ptrhead in Klassen

Beitrag von Kmitska » Do Apr 12, 2012 3:19 pm

Code: Alles auswählen

class test{
    public:
        friend void* loadMails(void* );
        test(){
            pthread_t threadOne;
            int i = pthread_create(&threadOne, NULL, loadMails, this );
        }

        static void* loadMails ( void* p )
        {
            while(true)
            {
                cout << " aa " << endl;
                Sleep(1000);
            }
        }
};


int main (void)
{
    test tesT();
    while(true){
        cout << "b" <<endl;
        Sleep(2000);
    }
}
Leider funktioniert dies nicht, und ich kann ja meine Variable als Parameter übergeben, oder?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Probleme mit ptrhead in Klassen

Beitrag von cloidnerux » Do Apr 12, 2012 3:25 pm

erstmal ist das

Code: Alles auswählen

 friend void* loadMails(void* );
Falsch. Es ist hier fehl am platz und sowieso nicht korrekt.

Code: Alles auswählen

int main (void)
{
    test tesT();
    while(true){
        cout << "b" <<endl;
        Sleep(2000);
    }
}
Reicht es thread_create aufzurufen oder muss man den thread auch noch iwie starten?
Gibt es eine Fehlermeldung oder was Funktioniert nicht?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Probleme mit ptrhead in Klassen

Beitrag von Kmitska » Do Apr 12, 2012 3:26 pm

pthread_create(); startet schon alles.
Und Fehlermeldung gibt's auch keine. :/

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Probleme mit ptrhead in Klassen

Beitrag von Kmitska » Do Apr 12, 2012 4:05 pm

Ich merke gerade, das ich aus einer Klasse garkein Funktionen rufen kann.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Probleme mit ptrhead in Klassen

Beitrag von Bebu » Do Apr 12, 2012 6:43 pm

Ich lese hier gerade etwas von Plattformunabhängig. Pthreads gibt es auch für Windows, das stimmt. Es ist allerdings ein C-Bibliothek und man kann nicht wirklich elegant damit arbeiten, vor allem wenn man Parameter an die Funktion übergibt, oder wieder zurückwill. Mann muss dann immer mit Konvertierungen von void* arbeiten. Mein Vorschlag für dich: Boost::thread. Die Syntax ist fast wie pthreads, aber es ist sauber in Klassen gekapselt. Kuck es dir mal an: http://www.highscore.de/cpp/boost/multithreading.html

Edit: Ich habe gerade festgestellt, dass man keine Rückgabewerte von einem Thread erhalten kann. Als Alternative kann man solche Werte in einem Klassenmember ablegen. Ich habe dir mal ein kleines Beispiel erstellt, das ziemlich genau das machen sollte, was du willst, allerdings mit Boost:

Code: Alles auswählen

#include <iostream>
#include <boost/thread.hpp>
#include <functional>

class test
{
  public:

  void loadMails()
  {
    std::cout << "I am the Thread" << std::endl;
    sleep( 2 );
    std::cout << "Threadtime is over now" << std::endl;
  }
};

int main (void)
{
  test tesT;
  std::cout << "I am from the main function" << std::endl;

  //starte Funktion als Thread->Für Memberfunktion ist bind nötig
  boost::thread MyThread( std::bind( &test::loadMails, tesT));

  //warte bis Thread beendet.
  MyThread.join();

  std::cout << "The Thread is finished" << std::endl;

  return 0;
}
Einen Thread in einer Klasse zu kapseln und dann damit die eigenen Member aufzurufen ist nur mit statischen Membern möglich, die Gründe hat dir cloidnerux schon genannt. Denk daran, du musst die libboost_thread dazulinken, sonst geht nichts.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Probleme mit ptrhead in Klassen

Beitrag von Kmitska » Do Apr 12, 2012 8:08 pm

Hallöchen,

habe das Problem auf meine eigene Art und Weise gelöst, auch wenn sie nicht unbedingt die Beste ist! :)

Ich habe einen globalen Zeiger deklariert der beim Konstruktor auf das Objekt zeigt und ebenfalls mein Thread aufruft.

Nun kann ich in der Funktion durch meinen Zeiger alles so gestalten wie ich es wollte.

Antworten