B
Ich hab ja schon etliche male versucht, das Problem nachzustellen. Dabei bekomme ich aber nix hin, was nicht funktioniert
Leider kann ich auch das Programm nicht weiter reduzieren, da hängt viel zu viel ineinander.
Dann skizziere ich erstmal die Klassen (2 relevante):
struct Observer
{};
class Alpha
{
static std::vector<Observer*> aObservers;
static void AddObserver( Observer* pObserver )
{ aObservers.push_back(pObserver); }
void DoSomething()
{ for (size_t i=0; i<aObservers.size(); i++) aObservers[i]->Notify(); }
};
class Beta : public Observer
{
Beta() { Alpha::AddObserver(this); }
// this-Zeiger im Konstruktor sind umstritten, aber es geht ja darum, warum
// der vector dann leer ist.
};
// Event wird ausgelöst:
Beta b;
// Hier ist aObservers.size() == 1
CreateNewThread... // Im Thread wird eine (genau eine) Instanz von Alpha erzeugt.
Beta.Work(); // Erzeugt im wesentlichen ein Fenster und fängt Nachrichten ab, sonst nix.
Ich versuche mal, das Ganze zeitlich zu skizzieren:
- Event wird ausgelöst
- Alpha::AddObserver wird aufgerufen
- Geht in CreateNewThread rein (erstellt neuen Thread), wo eine Methode aus einem Python-Skript aufgerufen wird, die dann wieder über ein Interface eine unserer Methoden startet.
- In dieser Methode wird eine Instanz von Alpha erzeugt.
- Steuerung geht wieder an Python zurück...
- ... und ruft wieder eine Methode von Alpha auf
- und schwupps ist der vector leer...
Ok, ich glaub ich werd noch ein paar Stunden lang Status-Meldungen reinsetzen und studieren
Und danke übrigens für deine Antwort!
Edit: Ich bin verzweifelt... Ich habs jetzt mit plumpen Messageboxen lokalisiert (von wegen stundenlange Status-Meldungen :D), der Fehler kommt hier:
Irgendeine Funktion:
...
// Hier ist die Größe des Vektors noch 1
DoSmltnStep( pPar->iStepCount );
...
DoSmltnStep:
// Hier, direkt nach Methodenaufruf, ist die Größe 0
Ich hab jetzt alles bereinigt und neu erstellt, keine Änderung. Kennt jemand sowas? Kann das ein Bug sein? Ich bin mir wirklich zu 99,9999% sicher, dass es zwischen diesen beiden Ausgaben "passiert". Und nein, die Statusmeldung leert das Ding nicht, es gibt keine 2 Funktionen, die "DoSmltnStep" heißen usw.
Ich... weiß nicht weiter
An den Threads kanns/solltes nicht liegen, der Haupthread macht 100% nix weiter mit Alpha. An Python kanns auch nicht liegen, an der Stelle ist es nicht im Spiel.
Falls es jemanden interessiert: Ich hab das Problem zwar nicht lösen, aber wenigstens identifizieren können.
Ein Projekt wurde als DLL erstellt, eins als Exe (die die DLL direkt und unter Umwegen von Python benutzt). Beide haben die Klasse mit der statischen Variable genutzt und hatten aber je eine eigene Version der Variable.
Sprich: Hat eine Funktion aus der DLL die statische Variable verändert, hat das aus der Sicht der Exe nichts verändert... Sauerei