Warsztat - Programowanie gier

Lipiec 30, 2010, 17:37:57 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Niepoprawnie zamykające się aplikacje.  (Przeczytany 385 razy)
DoS
Full Member
***

wiadomości: 150


Ehm... nope.


Zobacz profil WWW
« : Marzec 13, 2010, 12:03:50 »

Zapewne nie raz zdarzyło się każdemu podczas pisania aplikacji i późniejszego testowania, że program (czy to z przyczyn logicznych, czy jeszcze nie wyjaśnionych) wysypuje się w środku działania. Najczęściej kod nie jest w stanie posprzątać po sobie i zostawia czy to niedającą się zamknąć konsolę czy okienko. Sam w czasie pisanie tego postu posiadam na pasku zadań 3 niezamknięte konsole. Nie można ich zamknąć, procesu nie ma w menadżerze. Jedynym skutecznym sposobem jest reset komputera. Żeby naprawić błąd muszę często debugować program i prawie za każdym razem mam ten problem.

Moje pytanie brzmi: jak radzicie sobie z takimi niedogodnościami? Jakiś inteligentny kod, który zawsze i bezwzględnie usunie wszystkie wskaźniki? Może jakiś program do zabijania tych niesfornych pozostałości programu?

- Sfrustrowany Jacek
Zapisane

ORC |||||||||| 20%
Kuba D.
Hero Member
*****

wiadomości: 978


Zobacz profil
« Odpowiedz #1 : Marzec 13, 2010, 12:39:13 »

Jak sobie radzimy ? To proste, piszemy programy, które się poprawnie zamykają Wink

Jeśli program się wysypuje to znaczy, że coś jest z nim nie tak, jakaś niezainicjowana zmienna ( konfiguracja debug a release różni się w tym względzie), nieaktualny wskaźnik,  przekroczenie zakresu jakiejś tablicy i radosne mazanie po pamięci, kilkukrotna destrukcja jakiegoś wskaźnika itp. Odnośnie wskaźników to można wykorzystać smart-pointery, odpada wiele problemów.
Odnośnie tablic można wykorzystać jakieś gotowe ich implementacje w stylu wektora lub listy a dostep do ich elementów przez iteratory, zmienne zaś trzeba samemu inicjalizować ( np. przez przypisanie im zera).
Zapisane
DoS
Full Member
***

wiadomości: 150


Ehm... nope.


Zobacz profil WWW
« Odpowiedz #2 : Marzec 13, 2010, 13:05:39 »

Jak sobie radzimy ? To proste, piszemy programy, które się poprawnie zamykają Wink

Ale to nie jest zawsze takie oczywiste, że program jest napisany prawidłowo. Czasami pojawiają się też czynniki zewnętrzne. Podczas pisania sekcji sieciowej np. nie przewidziałem tego, że pakiet może się spóźnić albo przyjść w złej kolejności. Nieobsługiwana sytuacja i BACH! I nie było tego w cale tak łatwo znaleźć.
Albo biblioteka której przekazywałem wskaźnik swojego obiektu bez ostrzeżenia go usuwała po zakończeniu działania. I znów BACH podczas zwalniania zasobów, które nie doszło do końca.

Właśnie chodzi mi o tego typu sytuacje, które się już zdarzyły i nic nie można zrobić. Czy w takim przypadku jestem skazany wyłącznie na restart komputera?
Zapisane

ORC |||||||||| 20%
vashpan
SuperHero Member
******

wiadomości: 1599


Zobacz profil WWW
« Odpowiedz #3 : Marzec 13, 2010, 13:31:01 »

Ale one musza byc w menedzerze zadan, szukaj procesow takich jak np. conhost.exe, cmd.exe... Jaki masz system ?
Zapisane

Kuba D.
Hero Member
*****

wiadomości: 978


Zobacz profil
« Odpowiedz #4 : Marzec 13, 2010, 13:38:50 »

Pierwszy akapit był żarcikiem, nie da się wszystkiego przewidzieć Wink

Żeby pozabijać niesforne procesy które nie chcą się standardowo poddać musiałbyś się rozglądnąć za jakimś zaawansowanym menedżerem procesów.
Zapisane
DoS
Full Member
***

wiadomości: 150


Ehm... nope.


Zobacz profil WWW
« Odpowiedz #5 : Marzec 13, 2010, 14:08:47 »

Ale one musza byc w menedzerze zadan, szukaj procesow takich jak np. conhost.exe, cmd.exe... Jaki masz system ?

XP proffessional sp3. żadnych takich procesów nie znalazłem.
Co może być interesujące to program widnieje w zakładce "aplikacje" ze stanem"uruchomiony". Gdy daje: przejdź do procesu, przenosi mnie do pierwszego od góry.

EDIT:
Żeby pozabijać niesforne procesy które nie chcą się standardowo poddać musiałbyś się rozglądnąć za jakimś zaawansowanym menedżerem procesów.
Już się właśnie rozglądam. Dzięki.
« Ostatnia zmiana: Marzec 13, 2010, 14:10:46 wysłane przez DoS » Zapisane

ORC |||||||||| 20%
vashpan
SuperHero Member
******

wiadomości: 1599


Zobacz profil WWW
« Odpowiedz #6 : Marzec 13, 2010, 14:34:07 »

Stawiam wiec ze to jakies procesy-zoombie Wink Menedzer zadan raczej dziala dobrze, ale jezeli szukasz czegos naprawde fajnego to polecam Process Explorer - monitor systemu z prawdziwego zdarzenia Wink

Sproboj zrestartowac powloke Windows - explorer.exe, wystarczy zabic proces w manadzerze zadan i poprzez uruchom... odpalic go z powrotem ( w sumie nie pamietam czy sam sie nie zresatartuje ), moze to spowoduje ze te male gnojki zgina... Smiley

Ale tak naprawde to tylko polsrodki, trzeba zlikwidowac przyczyne, odpal po prostu swoja aplikacje pod debuggerem i zobacz co sie stanie...
« Ostatnia zmiana: Marzec 13, 2010, 14:36:56 wysłane przez vashpan » Zapisane

Groshu
Sr. Member
****

wiadomości: 262



Zobacz profil
« Odpowiedz #7 : Marzec 13, 2010, 14:38:42 »

Stawiam wiec ze to jakies procesy-zoombie Wink Menedzer zadan raczej dziala dobrze, ale jezeli szukasz czegos naprawde fajnego to polecam Process Explorer - monitor systemu z prawdziwego zdarzenia Wink

Sproboj zrestartowac powloke Windows - explorer.exe, wystarczy zabic proces w manadzerze zadan i poprzez uruchom... odpalic go z powrotem ( w sumie nie pamietam czy sam sie nie zresatartuje ), moze to spowoduje ze te male gnojki zgina... Smiley
Nawet jak znikną z paska to i tak skradzionej pamięci to nie zwolni.
Zapisane

Umiejętności zawodowe:
- wieloletnie doświadczenie w administrowaniu kontem na nk Cheesy
Xion
Member2000
*******

wiadomości: 2507



Zobacz profil WWW
« Odpowiedz #8 : Marzec 13, 2010, 15:06:32 »

Cytuj
Ale to nie jest zawsze takie oczywiste, że program jest napisany prawidłowo. Czasami pojawiają się też czynniki zewnętrzne. Podczas pisania sekcji sieciowej np. nie przewidziałem tego, że pakiet może się spóźnić albo przyjść w złej kolejności.
Nie wiem jak w tej sytuacji zachowuje się Windows, ale systemy Uniksowe nie ubijają od razu procesów, do których należą deskryptory socketów czekające na informacje zwrotne z protokołów sieciowych (czyli np. ACKi z TCP/IP). Da się to zachowanie wyłączyć (opcje typu "linger"), ale domyślnie jest właśnie takie. Więc nie zawsze "wiszący" jeszcze przez chwilę proces jest błędem.

W ogólności przyczyn może być jednak mnóstwo, z kręcącą się bez sensu (bo bez okien) pętlą komunikatów na czele.
Zapisane

DoS
Full Member
***

wiadomości: 150


Ehm... nope.


Zobacz profil WWW
« Odpowiedz #9 : Marzec 13, 2010, 15:18:50 »

Niestety ani Process Explorer ani 2 inne nie pomogły w tym wypadku. Ubicie explorera windowsa też nie zlikwidowało problemu.
Ale tak naprawde to tylko polsrodki, trzeba zlikwidowac przyczyne, odpal po prostu swoja aplikacje pod debuggerem i zobacz co sie stanie...
Debuguje ją, tylko najczęściej takiemu niedoświadczonemu koderowi jak mi nie zawsze wystarcza jedno odpalenie i likwiduje problem. Najczęściej prędzej kończy mi się pamięć. Cheesy
A najgorsze są chyba moduły, które wcześniej działały dobrze ale gdy dodałem nową część to się sypią.  Roll Eyes
EDIT:
W ogólności przyczyn może być jednak mnóstwo, z kręcącą się bez sensu (bo bez okien) pętlą komunikatów na czele.
U mnie akurat to nie zwolnienie ani biblioteki GUI ani poprawne wyjście, które windows uznałby za dobry moment do wyłączenia konsoli. Smiley
« Ostatnia zmiana: Marzec 13, 2010, 15:21:36 wysłane przez DoS » Zapisane

ORC |||||||||| 20%
Strony: [1]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC