C# takoj prekini z delom

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

C# takoj prekini z delom

OdgovorNapisal/-a VolkD » 24 Jun 2018, 00:05

Koda: Izberi vse
        public MainWindow()
        {
            InitializeComponent();

            string[] dllFileNames = null;
            string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            path += "\\DIVUnits";
            if (Directory.Exists(path))
            {
                dllFileNames = Directory.GetFiles(path, "DIV_*.dll");
            }
            // v tej točki imamo v dllFileNames vse dll-je, ki so v program \DIVUnits direktorjiju in se njihovo ime začne z DIV_.
            if (dllFileNames == null)
            {
                System.Windows.MessageBox.Show(path+" ni dosegljiv.");
                System.Windows.Application.Current.Shutdown();
            }
            foreach (string s in dllFileNames) ListBox1.Items.Add(s);

Če ugotovim, da direktorija ni, potem nima smisla nadaljevati in bi program rad prekinil. Tisti shutdown() naj bi to tudi naredil in verjetno tudi naredi, a prepozno.
Program namreč pred tem krešira, ker v zadnjem stavku foreach list dllFileNames nima elementov.
Prosim za kakšno prijazno rešitev.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 40269
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8357 krat
Prejel zahvalo: 4893 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a s54mtb » 24 Jun 2018, 00:17

Lepo "pohendlaj" exception. A ni to eno od pravil lepega programiranja ?

Koda: Izberi vse
try
        {
                 foreach(........)
        }
        catch (Exception e)
        {
            Shutdown();
        }
Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 10891
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1507 krat
Prejel zahvalo: 3871 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a VolkD » 24 Jun 2018, 00:27

Ni razloga za tako delo. Saj že prej vem, da moram končati, ker ni več kaj početi. Torej,.. jaz sem Shutdown že naredil, ampak se bo izvedel šele ko bom MainWindow končal. Do tam je pa kode ohoho in ne samo foreach.

Torej, tudi ko napišem kot si predlagal, se stvar grdo ustavi na prvi naslednji instrukciji, ki potrebuje to listo.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 40269
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8357 krat
Prejel zahvalo: 4893 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a s54mtb » 24 Jun 2018, 00:42

Pol pa if obrni in nadaljuj samo če ni null. Če imaš "ohoho" kode, ki se nekontrolirano izvaja samo pomeni, da imaš zanič strukturo programa.
Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 10891
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1507 krat
Prejel zahvalo: 3871 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a igo » 24 Jun 2018, 01:36

Kaj se zgodi, če drugi if nadomestiš z else?
Koda: Izberi vse
        public MainWindow()
        {
            InitializeComponent();

            string[] dllFileNames = null;
            string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            path += "\\DIVUnits";
            if (Directory.Exists(path))
            {
                dllFileNames = Directory.GetFiles(path, "DIV_*.dll");
            }
            // v tej točki imamo v dllFileNames vse dll-je, ki so v program \DIVUnits direktorjiju in se njihovo ime začne z DIV_.
            else
            {
                System.Windows.MessageBox.Show(path+" ni dosegljiv.");
                System.Windows.Application.Current.Shutdown();

              return dllFileNames; // Če je enako 0, sporoči ostalim, da je bilo nekaj narobe in leti ven
            }
// sicer lepo nadaljuje
            foreach (string s in dllFileNames) ListBox1.Items.Add(s);

Ko bo program ugotovil, da pogoj v if ni izpolnjen, bo napravil tisto v else.

Ampak mislim, da je osnovni problem v tem, da se Shutdown() lepo izvede, nato pa se dokonča še celoten MainWindow().
V takem primeru se znotraj istega { } takoj za Shutdown() doda return;
ali še bolje
return dllFileNames;
da bo naslednja funkcija vedela, da se MainWindow ni prav izvršil.
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
igo
 
Prispevkov: 1429
Pridružen: 11 Apr 2015, 13:38
Kraj: Krško
Zahvalil se je: 171 krat
Prejel zahvalo: 349 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 33

Re: C# takoj prekini z delom

OdgovorNapisal/-a VolkD » 24 Jun 2018, 02:18

Takole deluje natanko tako kot sem želel.
Koda: Izberi vse
            if (dllFileNames == null)
            {
                System.Windows.MessageBox.Show(path+" ni dosegljiv.");
                System.Windows.Application.Current.Shutdown();
                Environment.Exit(0);
            }
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 40269
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8357 krat
Prejel zahvalo: 4893 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a VolkD » 24 Jun 2018, 08:53

igo je napisal/-a:Ampak mislim, da je osnovni problem v tem, da se Shutdown() lepo izvede, nato pa se dokonča še celoten MainWindow().
V takem primeru se znotraj istega { } takoj za Shutdown() doda return;
ali še bolje
return dllFileNames;

Imaš kar prav. Natančno to se dogaja. Exit se mi je zdel kar primeren za tole. Tip aplikacije pa je WPF.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 40269
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8357 krat
Prejel zahvalo: 4893 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a Kroko » 24 Jun 2018, 09:19

Uporaba System.Enviroment.Exit je grda in tule povsem neprimerena. Ker se program ni pravilno zaključil je vprašanje, kaj se je zgodilo z alociranimi resursi.

Programski tok moraš upoštevati za vse primere, tudi takrat ko pelje v Shutdown, ne pa samo za tebi ugodno situacijo.

Koda: Izberi vse
if (dllFileNames == null)
 {
  System.Windows.MessageBox.Show(path+" ni dosegljiv.");
  System.Windows.Application.Current.Shutdown();
}
else
{
  foreach (string s in dllFileNames) ListBox1.Items.Add(s);
}
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4735
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 676 krat
Prejel zahvalo: 1624 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a peterp » 24 Jun 2018, 09:25

Kroko je napisal/-a:Ker se program ni pravilno zaključil je vprašanje, kaj se je zgodilo z alociranimi resursi.
Če se je aplikacija zaprla so se avtomatsko sprostili.
peterp
 
Prispevkov: 637
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 152 krat
Prejel zahvalo: 100 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 102

Re: C# takoj prekini z delom

OdgovorNapisal/-a Kroko » 24 Jun 2018, 09:57

Počistili se bodo samo resursi za katere ve operacijski sistem. Vsi ostali bodo ostali odprti.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4735
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 676 krat
Prejel zahvalo: 1624 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a gumby » 24 Jun 2018, 10:48

btw vsaj neko drugo kodo bi dal, če že exit() uporabljaš. 0 pomeni, da je bilo vse OK ;)
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2537
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 107 krat
Prejel zahvalo: 593 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 64

Re: C# takoj prekini z delom

OdgovorNapisal/-a VolkD » 24 Jun 2018, 10:56

Kroko je napisal/-a:Počistili se bodo samo resursi za katere ve operacijski sistem. Vsi ostali bodo ostali odprti.
Prav je, da nekateri ostanejo. Program služi temu, da starta nekaj dll-jev. Če so v določenem direktoriju še drugi starta tudi te, če ne,... Pred tem mora seveda marsikaj preveriti, če jih ni mu ni treba.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 40269
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8357 krat
Prejel zahvalo: 4893 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a VolkD » 24 Jun 2018, 10:56

gumby je napisal/-a:btw vsaj neko drugo kodo bi dal, če že exit() uporabljaš. 0 pomeni, da je bilo vse OK ;)
V bistvu ni nič narobe če tako konča. Pomeni le, da ni nekih extra modulov.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 40269
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8357 krat
Prejel zahvalo: 4893 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a peterp » 24 Jun 2018, 13:48

Kroko je napisal/-a:Počistili se bodo samo resursi za katere ve operacijski sistem. Vsi ostali bodo ostali odprti.
Lahko daš en konkreten primer, kjer se resourci ne sprostijo? Za razširitev obzorja ;)
peterp
 
Prispevkov: 637
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 152 krat
Prejel zahvalo: 100 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 102

Re: C# takoj prekini z delom

OdgovorNapisal/-a Kroko » 24 Jun 2018, 14:36

Environment.Exit nasilno pobije vse threade. Podobno kot če bi v task managerju ubil task. To se uporabi samo v primeru, da ees ni druge možnosti elegantno (gracefully) končati aplikacijo.

Shutdown WPF aplikacijo konča elegantno. Podobno kot v Forms aplikaciji Applicatin.Exit, ki elegantno konča message loop.

Environment.Exit se ne uporablja razen če programer točno ve, kaj počne. Na primer kakšen unexpected exception handler ali pa kakšen specifičen tip aplikacije (npr konzola).

Samo dejstvo, da ti Shutdown ne dela kot pričakuješ pomeni, da nekaj počneš hudo narobe.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4735
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 676 krat
Prejel zahvalo: 1624 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C# takoj prekini z delom

OdgovorNapisal/-a Cvetko » 24 Jun 2018, 16:24

Prebiram to o takojšnjem koncu. Sicer o c# nimam pojma. Vidim le podobnost s c-jem.
Vsemu navkljub sem se oglasil, ker me moti, da v tej temi kritizirate rešitev, ki jo je dal avtor, spregledali pa ste, da druge boljše rešitve ni podal nihče.
Z enim stavkom - namesto osla mlatite po lastni senci.
Cvetko
 
Prispevkov: 510
Pridružen: 20 Jan 2015, 10:16
Zahvalil se je: 27 krat
Prejel zahvalo: 130 krat
Uporabnika povabil: cimabella
Število neizkoriščenih povabil: 15


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost