Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Problem mit void *arg bei pThreads

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.02.2004
    Ort
    Grefrath
    Beiträge
    28

    Problem mit void *arg bei pThreads

    Hi!
    Ich habe ein Problem mit pThreads.
    Ich habe eine Variable und starte einen pThread in main():
    Code:
    string* TrafficIn = new string; 
    pthread_t CollectTrafficInThread;
    pthread_create(&CollectTrafficInThread, 0, &CollectTrafficIn, static_cast<void*>(TrafficIn) );
    Meine Funktion, die aufgerufen wird:
    Code:
    void *CollectTrafficIn( void *ptr)
    {
    string TEMP="", TEMP2="", *Antwort=new string; 
    [...]
    *Antwort = "(" + TEMP + "-" + TEMP2 + ") * 8 / 1024 / 1024 / 10";
    cout << *Antwort << endl;
    ptr = Antwort; /??
    }
    Das Cout schreibt Antwort korrekt nach stdout, nur in main kommt es nie in TrafficIn.
    Ein cout << *TrafficIn << endl; oder ein cout << TrafficIn->c_str() << enld; liefert nur eine leere Zeile.
    Ich habe schon mehree static_casts ausprobiert bei ptr = Antwort, es ändert sich aber nie etwas daran, das in main() die Variable nie verändert wird.

    Hat jemand eine Idee, welche Anweisung TrafficIn vernünftig zuweisen würde?

    MfG
    Sebastian

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von zeeman
    Hat jemand eine Idee, welche Anweisung TrafficIn vernünftig zuweisen würde?
    Code:
    *static_cast<std::string*>(ptr) = *Antwort;
    Dann würde ich nicht die ganzen std::string's aufm Heap anlegen.
    Code:
    	string TrafficIn;
    	pthread_t CollectTrafficInThread;
    	pthread_create(&CollectTrafficInThread, 0, &CollectTrafficIn, &TrafficIn);
    ...
    void *CollectTrafficIn( void *ptr)
    {
    	string TEMP="", TEMP2="",Antwort;
    	Antwort = "(" + TEMP + "-" + TEMP2 + ") * 8 / 1024 / 1024 / 10";
    	cout << Antwort << endl;
    	*static_cast<std::string*>(ptr) = Antwort;
    }

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Die Variable TrafficIn zeigt ja nach wie vor auf die selbe Adresse, du hast nur die Parametervariable auf einen neuen Pointer gesetzt.

    Du willst in Wirklichkeit das machen

    Code:
    *(reinterpret_cast<string*>(ptr)) = *Anwort;
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von anda_skoa
    Code:
    *(reinterpret_cast<string*>(ptr)) = *Anwort;
    Also ich hab hier in O'Reillys C++ in a Nutshell stehn:
    ... You can use static_cast to cast a pointer to and from void*.
    Und weiters steht das man reinterpret_cast dann verwenden soll, wenn wirkl. was total anders interpretiert werden soll, z.B. aus nen int einen pointer machen oder umgekehrt.

    Generell ist's IMHO g'scheiter zuerst static_cast zu verwenden und wenn der Kompiler mekert nachschaun ob mannen Fehler hat und wenn nicht, dann halt ein reinterpret_cast verwenden (aber man sollte immer wissen warum man das an der Stelle jetzt verwenden muss).
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

Lesezeichen

Berechtigungen

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