Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.03.2011, 08:39

boost::bind<void>(&foo::mem_fun, &foo_instance) und 0xCCCCCC

Also ich will an einen Thread eine Funktion übergeben, dazu pack ich mir die in ein schönes boost::function-Objekt. Da es eine Memberfunktion von foo ist, nutz ich dafür boost::bind um entsprechend eine foo-Instanz dran zu binden. Jetzt zeigt mir allerdings der Debugger, dass bound_memfunc_ptr {memfunc_ptr=0x004f5dc5 obj_ptr=0xcccccccc } an, wenn ich mir das boost::function-Objekt anguck. Jemand ne Idee wodran das liegen könnte?

Danke schonmal,
gruß
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

18.03.2011, 08:43

Spontan geraten: Du erstellst mit "boost::bind(...)" ein temporäres Objekt, dass nur so lange existiert, wie der Funktionsaufruf braucht. Wenn der Funktionsaufruf nun aber einen Thread startet und dort drin erst das temporäre Objekt gebraucht wird, ist es vielleicht bis dahin gar nicht mehr existent. Lege das boost::bind()-Objekt mit längerer Lebenszeit an und schau, ob es dann geht.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

18.03.2011, 10:40

Nja bin grad nicht zu hause ... in etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class progress
{
    class thread
    {
        boost::function<void()> m_function;
        bool m_active;

    public:
        thread(boost::function<void()> const& function)
            : m_function(function), m_active(true)
        { }

        void run()
        { 
            m_function(); 
            m_active = false; 
        }

        const bool active() const { return m_active; }
    } m_thread;

public:
    progress(boost::function<void()> const& function)
        : m_thread(function)
    {}
};

also nein ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

18.03.2011, 10:52

Die Klasse allein sagt aber nichts über ihre Lebensdauer aus.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

18.03.2011, 11:24

sry stimmt schon, m_progress existiert solange bis der thread nichtmehr aktiv ist und enthält (vgl. oben) eine Kopie des Funktionsobjektes.

C-/C++-Quelltext

1
m_progress = new progress(boost::bind<void>(&foo::function, &foo_instance));
foo existiert die ganze Zeit.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

18.03.2011, 13:13

Unabhängig von der Lebensdauer des Objektes ansich sollte zumindest der Zeiger auf das Objekt für den Moment der Erstellung gescheit aussehen. Prinzipiell würde ich die boost bind Geschichte mal aus dem Threading krams "ausklingen" und einfach mal so testen. Sprich

C-/C++-Quelltext

1
2
boost::function<void()> m_function = boost::bind<void>(&foo::function, &foo_instance)); 
m_function();

Danach mal im Ctor schauen und danach erst ne Kopie im Ctor ziehen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

7

19.03.2011, 18:14

Problem hat sich mitlerweile erledigt. Bzw. der Wert der drin steht (laut debugger) ist immernoch 0xcccccc, aufrufen kann er die Funktion aber dennoch richtig.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige