ukončení aplikace   zodpovězená otázka

C#

DObrý den,

jedna z činností mé aplikace je, že poslouchá na určitém udp portu. Naslouchání spouštím ve zvláštním vlákně, kde je pak cyklus while, ve kterém je prováděno zpracování přijatých dat. Používám třídu UDPClient.

Pro ukončení aplikace nejdříve abortnu vlákno, uzavřu udp klienta a pak provedu Application.Exit;

Vše vpořádku, aplikace se ukončí korektně.

Ale nevím, jak ošetřit ukončení aplikace přes křížek win okna. Zde sice form zmizí, ale aplikace se asi korektně neukončí, při jejim dalším spuštění vznikne chyba zřejmě způsobená neustálým obsazením daného udp portu.

Prosím o radu, jsem začátečník (věčný).

děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to přesně vím čím to je :). S tímto problémem se setkávají desítky lidí. Jde o naprosto fádní věc - v momentě kdy vytvoříte vlákno které naslouchá, tak jeho IsBackground vlastnost je automaticky nastavena na False. To znamená, že toto vlákno je vlákno na popředí. Jestliže aplikace obsahuje alespoň jedno běžící vlákno na popředí, NELZE JI UKONČIT. Před spuštěním vlákna nastavte IsBackground na True. Tím zajistíte, že toto vlákno bude běžet na pozadí (v ThreadPoolu) a aplikaci půjde ukončit i když vlákno bude běžet. Přeji mnoho úspěchů.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

díky moc... pomohlo to...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chtel bych se zeptat na jinou vec. V aplikaci mam program a okno. Abych mohl z programu obsluhovat komponenty v okne musel jsme si udelat Invoky, napr.:

      private void SetInfo(string text)
        {
            if (this.ListBox.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetInfo);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.tbInfo.Text = text;
            }            
        }

To sice funguje dobre, ale pokud aktualizuji text v ListBoxu rychle a pak zavru aplikaci tak se mi to hryzne a vypise se hlaska:

System.StackOverflowException was unhandled

Asi ze nemuze zapisovat do toho ListBoxu. Ve studiu pak vidim jak se pomalu vzpisuji hlasky o ukoncovani threadu nez jmena.

Nevite prosim vas nekdo cos tim. Neco jako kill, nebo tak.

Diky PP

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Z vašeho dotazu není nic jasné. Použití BeginInvoke (používejte ho místo Invoke, protože je asynchronní) má smysl pouze v případě, kdy chcete přistupovat k ovládacím prvkům z jiného vlákna než ze kterého byly vytvořeny, navíc tento způsob je zastaralý, používá se proto WindowsFormsSynchronizationContext.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je právě to, čeho se spousta nás amatérů nemůže dočkat - pokračování Vašeho seriálu. Chápu, že v dněšní době je každý schopný člověk sakramentsky zaměstnán, ale už to je skoro rok co vyšel první díl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvam se za nekvalitni popis situace. Problem jsem nakonec vyresil jinak. BeginInvoke asi pomohl, ale problem pri ukoncovani aplikace zustaval a hlaska s chybou se mi ve studiu zobrazovala u prikazu Close(). Tak jsem nahradil Close() prikazem Application.Exit(). Tak ted uz je to dobry.

Neni to asi korektni z pohledu profi programatora, ale ja nejsem C# programator a tuto aplikaci mam jen jako zobrazovac "okenkovy interface" externiho zarizeni.

Dekuji za tip a za odpoved.

S pozdravem PP

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback