Jak usunąć obiekt?

0

Tworzymy dynamicznie przycisk, nadajemy mu parametry i umieszczamy na oknie.

            Button btn1 = new Button();
            btn1.Width = 60;
            btn1.Height = 20;
            btn1.Content = "przycisk1";
            grid1.Children.Add(btn1);

Jak teraz możemy usunąć w ten sposób utworzony przycisk?

0

Nie wiem, czy dobrze zrozumiałem ale, żeby usunąć z formatki przycisk spróbuj mniej więcej czegoś takiego:

this.Controls.Remove(this.btn1)
0

W wpf kontrolki nie mają takiej metody.

1

grid1.Children.Remove(sender as Button);

0

A czy jest możliwość usunięcia obiektu który nie jest kontrolką tylko instancją własnej klasy?

0

Co próbujesz zrobić?

0

@Patryk27: W uproszczeniu robię małą gre w której mamy czołgi, będącą instancjami klasy Tank. Klasa ta m.in dynamicznie tworzy obraz czołgu oraz wątek odpowiadający za jego ruch. Jeżeli dany czołg zostanie zniszczony to chciałbym żeby był usuwany cały obiekt. Obecnie jest usuwany tylko Image czołgu sposobem Andrzeja Guźca napisanym 3 posty wcześniej oraz Abort()uje wcześniej wspomniany wątek.
Chodzi o te że działa strzelające w czołgi działają na zasadzie że wykrywają najbliższy czołg i w niego strzelają. Teraz jak czołg zostanie zniszczony i nawet jego obraz został usunięty to i tak jako obiekt istnieje i działa wciąż w niego strzelają.

EDIT: Udało mi się przestawić wskaźnik na dany czołg na null w momencie zniszczenia więc problem jest rozwiązany. Niemniej jeśli istnieje sposób na wymuszenie usunięcia obiektu to chętnie go poznam.

0

zawsze dodatkowo możesz ręcznie wywołać GC, bo referencje usunąłeś ale czy on od razu zostanie usunięty z pamięci to raczej nie.

1

Nie powinieneś bawić się w ręczne zarządzanie pamięcią - jeśli tak musisz robić, masz błąd projektowy.

W Twoim przypadku wydaje mi się, że masz niewłaściwie przemyślany sam mechanizm działania czołgów - dlaczego bawisz się w wielowątkowość, zamiast napisać zwyczajny game loop?

0
Patryk27 napisał(a):

Nie powinieneś bawić się w ręczne zarządzanie pamięcią - jeśli tak musisz robić, masz błąd projektowy.

Dlaczego jest to błąd projektowy?

2

Ponieważ wykorzystywanie GC dodatkowo jako kontenera zawierającego spis encji gry zmienia jego sens istnienia [a] oraz utrudnia czytanie [b] (jak i również sensowne debugowanie [c]) kodu.

a) GC istnieje po to, aby zarządzać czasem istnienia obiektów w sensie czy należy go już usunąć, bo jest potrzebna wolna pamięć, a nie czy należy ten obiekt usunąć, ponieważ gracz umarł.

b, c) imho znacznie czytelniejsze będzie rozwiązanie wykorzystujące wprost spis obiektów w połączeniu z normalnym game loop zamiast tej całej wielowątkowości - dzięki temu w dowolnym momencie gry lista aktywnych statków/whatever będzie w stu procentach deterministyczna, a nie polegająca na implementacji GC/częstotliwości ręcznego jego wywoływania.

1

Jeśli dana jednostka/potwór/pojazd ma "zginąć" w grze, to po prostu należy go usunąć z kolekcji wszystkich obiektów gry. Nie trzeba żadnego ręcznego zarządzania pamięcią, zerowania ani nawet przypisywania null.
Oddzielny wątek dla każdej jednostki brzmi jak jakieś programistyczne piekło.

@Erwin14 - naucz się najpierw podstaw programowania w konsoli, potem bierz się za gry.

0

Ja mam takie pytanie, czy aby nie masz nieskończonej pętli w nowych wątkach? W takim razie wywołanie abort niewiele daje, z tego co pamiętam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.