Aktuelle Zeit: 22.12.2024, 09:37

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: 29.10.2007, 11:19 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
ich baue gerade an einem hauptmenü template, um genau zu sien arbeite ich gerade am optionsmenü für die grafik.
zeichne ein paar checkboxen und schiebe den pointer von der gereade erstellten checkbox in ein liste, das problem ist aber das das jedes mal gemacht wird wenn man auf den optionen button drückt. Also das die objekte immer neu erstellt werden wenn man auf Optionen drückt und auch dementsprechend viele pointer neu in die liste geschoben werden.
bis jetzt hat das ganze trotzdem funktionier, aber dann müsste ich jedes objekt mehrfach im speicher haben wenn ich öffters auf optionen drücke.
kann ich nachprüfen ob das IGUIWindow geschlossen wurde und wenn ja das IGUIWindow und alle child elemente löschen, oder werden die objekte bereits gelöscht wenn ich das IGUIWindow schliesse?
Ich möcht ja immerhin kein Buffer-overflow erzeugen


Nach oben
 Profil  
 
BeitragVerfasst: 29.10.2007, 15:45 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
buffer overflows werden dadurch nicht erzeugt, ich glaube du meinst eher memory leaks ;)

Aber keine angst, die werden dadurch auch nicht erzeugt. Schließlich fügt man ein element ja mit addButton (z.b) hinzu. Und wie man der dokumentation entnehmen kann werden objekte die durch eine funktion die nicht mit 'create' anfängt von irrlicht verwaltet.

Das schlimmste was dir in diesem Fall passieren könnte wär, dass du zwei optionsfenster hast.

Du könntest natürlich ein flag setzten, wenn das optionsmenu genöffnet wird und dann bei jedem weiteren öffnen prüfen ob diese flag gesetzt ist.

Um zu wissen ob das Fenster geschlossen wurde, musst du das event EGET_BUTTON_CLICKED abfangen und überprüfen, ob der Caller der Close-Button des Fensters ist => IGUIWindow::getCloseButton();

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 29.10.2007, 16:13 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
Zitat:
ich glaube du meinst eher memory leaks

nein genau die meine ich nicht weil ich weis das irrlicht die objekte intern verwaltet.

ums mal noch genauer zu zeigen warum ich frage ob das/die objekt(e) zerstört werden hier mal ne kleine beispielklasse wie mein menü grad arbeitet:
Code:
class MyEventReceiver : public IEventReceiver
{
private:
IrrlichtDevice *device;
list<IGUICheckBox*> m_BoxList;
public:
   void MyEventReceiver(IrrlichtDevice *tmpDevice)
   {
      device = tmpDevice;
   }

   virtual bool OnEvent(SEvent event)
   {
      if (event.EventType == EET_GUI_EVENT)
      {
         s32 id = event.GUIEvent.Caller->getID();
            switch(event.GUIEvent.EventType)
            {
            case EGET_BUTTON_CLICKED:
                   if (id == 101) //optionsbutton
                   {
                      IGUIWindow *Window1 = device->getIGUIEnvironment()->addWindow(core::rect< s32 >(x1,y1,x2,y2),false,L"Options",0,120);
                      m_BoxList->push_back(device->getIGUIEnvironment()->addCheckBox(false,core::rect< s32 >(x1,y1,x2,y2),Window1,121,L"Options"));
                      return true;
                   }
              break;
          }
       }
       return false;
    }
};

das problem ist halt erstmal wirklich das ich selbst nicht weis ob das objekt zerstört wird wenn der closeButton gedrückt wurde, weil ich das/die objekt(e jedes mal neu erstelle)

ps code is ausm kopf

und das mit dem prüfen ob closeButtongedrückt wurde werd ich mir mal ansehen und ausprobieren


Nach oben
 Profil  
 
BeitragVerfasst: 29.10.2007, 20:24 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
öh willst du das man mehrere fenster haben kann?
sonst könntest du singleton-mäßig einfach gucken ob das fenster schon erzeugt wurde und dann einfach wieder sichtbar machen..oder nicht?

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
BeitragVerfasst: 29.10.2007, 20:34 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
hmm also eigentlich ist es mir egal wie viele von diesen fenstern man aufruft.
ich hab eben zumindest ausprobiert ob ich das fenster wieder sichtbar machen kann wenn ich das fenster über das x oben rechts schliesse und nein ich krieg ne unbehandelte ausnahme gegen den kopf geschmissen, ich weis aber trotzdem noch nicht ob das objekt nun gelöscht wurde oder nicht^^


Nach oben
 Profil  
 
BeitragVerfasst: 29.10.2007, 20:59 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
nu, es wird doch erst gelöscht, wenn keine referenzen mehr gibt, oder nich?
und das kann man doch jetzt per IReferenceCounted::getReferenceCount() prüfen..

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
BeitragVerfasst: 29.10.2007, 22:34 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
gaaaanz schlechte ideee.
Wenn es dann nämlich gelöscht wurde, ist der zeiger nichtmehr gülitg und er bekommt die nächste exception ^^

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 30.10.2007, 09:29 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
so also die objekte werden wohl gelöscht ansonnsten würd ich keine exeption kriegen wenn ich versuche die entsprechenden checkboxen die in der liste stehen anzusprechen.
aber ich hab es jetzt mit dem vorschlagsansatz von frodenius gelöst

wenn auf den options button gedrückt wird, wird geprüft ob OptionsExist = true ist oder nicht,
wenn false -> optionsWindow und childs werden erzeugt und optionsWindow->getCloseButton()->setVisible(false) wird gesetzt so das der close button nicht mehr zu sehen ist
wenn true -> optionsWindow->setVisible(true) setzen

da der close Button ja sozusagen nichtmehr nutzbar ist, wird dieser durch einen neuen ersetzt der das fenster nur invisible setzt.

so ist das fenster nur einmal geöffnet und es wird auch nicht zu viel in die liste geschoben^^


Nach oben
 Profil  
 
BeitragVerfasst: 30.10.2007, 10:49 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
Sylence hat geschrieben:
gaaaanz schlechte ideee.
Wenn es dann nämlich gelöscht wurde, ist der zeiger nichtmehr gülitg und er bekommt die nächste exception ^^

öhh wenn das brain buggy ist...
ok ein kleiner rettungsversuch :? ein grab dranhängen und dann testen ob referenceCount = 1 ..:)

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
BeitragVerfasst: 30.10.2007, 13:52 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
ich lass dich ertrinken ^^
wird auch zu ner exception führen.

Wie gesagt: der zeiger ist nichmehr gültig wenn der letzte drop ausgeführt wurde.
Du versuchst dann grab auf einen bereich im speicher auszuführen, der gelöscht wurde.

Ach ich bin mal nicht so *rettungsringwerf*
zur not müsste man das ganze in einem try block packen und die exception abfangen. Ist halt nur ein wenig sehr viel overkill ^^

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 30.10.2007, 14:09 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
nee ja is klar.. ^^
das grab war ja auch beim erstellen des window gemeint.. soo doof bin ich hoffentlich nun auch wieder nich..
:P

p.s.: exceptions sind kein overkill, sie sind das tollste was gibt!

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
BeitragVerfasst: 30.10.2007, 15:12 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
so is also erstmal erledigt oder wollt ihr noch ne weile über exeptions diskutieren :D

is halt so das ich mir nen Hauptmenü Modul basteln möcht bei dem alle einstellungen aus einer xml datei geladen werden.
Dann können zB. die Grafikoptionen verändert werden und die neuen Werte werden in der xml datei gespeichert.
dann wird wenn man auf übernehmen drückt das device gelöscht und neu erstellt (natürlich mit den neuen einstellungen).

Ich hab unter anderrem noch vor die buttons und das design über xml dynamisch zu gestalten so das man zB eine Grafik auf dne Button zeichnen kann oder die position des buttons ändern kann ohne das projekt neu compilieren zu müssen.

würd gerne mal von euch wissen was ihr von der idee haltet das als template projekt zur verfügung zu stellen


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de