Vlákna, jak je ukončit – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vlákna, jak je ukončit – .NET – Fórum – Programujte.comVlákna, jak je ukončit – .NET – Fórum – Programujte.com

 

Kartmen
~ Anonymní uživatel
57 příspěvků
5. 3. 2020   #1
-
0
-

Ahoj, chci si zeptat, jestli existuje nějaká dobrá možnost jak ukončit nejlépe jen proceduru (ne vlákno), která již není potřeba. Mam třeba 10 vláken, které počítají to samé jiným způsobem, když nejrychlejší vlákno spočte výsledek, tak ostatní již není potřeba dopočítávat... Nejradši bych chtěl ukončit jen aktuálně spuštěné akce na vláknech a nahradit je jinými, podobně jako když se vlákno nějakou metodou spustí. Nebo to nelze a je nutné, aby časově náročná procedura sama testovala, jestli se nemá ukončit? Nebo použit nic moc řešení a Thread.Abort() a udělat si vlákno jiné?

Nahlásit jako SPAM
IP: 88.103.206.–
KIIV
~ Moderátor
+43
God of flame
5. 3. 2020   #2
-
0
-

Obvykle se to dela atomickou promennou (pripadne synchronozovanou mutexem, neco podobneho bude pravdepodobne i v .net), kterou nastavis na false, kdyz chces ukoncit vlakno (a vlakno si ji samozrejme musi testovat). Pak uz jen testovat jestli je vlakno joinovatelne (pokud je tak nastaveno) a dorazit ho.

Jinej zpusob je mit thread pool a predavat mu ukoly pomoci fronty a semaforu. Pak spousteni ani konceni neresis. Alespon ne na urovni vlaken ale ukolu - opet pomoci nejake promenne.

Nahlásit jako SPAM
IP: 37.48.58.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kartmen
~ Anonymní uživatel
57 příspěvků
6. 3. 2020   #3
-
0
-

Díky za odpověď, vlastně něco jako ThreadPool se snažím napsat. ThreadPool použiju třeba příště, ale chtěl bych si to zkusit. Jsem to nazval blbě, vlákno bych chtěl nejlépe zachránit (vytvořit nové trvá), to co chci ukončit je kód, který na vláknu běží a nahradit ho jiným, když už není výsledek předchozího potřeba. Co jsem zatím napsal funguje asi takto: do mojí alternativy ThreadPoolu se posílají akce, které mají proběhnout, třída je umisťuje na volná vlákna. Když se jedna akce spočte, tak se další umístí na stejné vlákno. Problém je co s akcí, která je signalizovaná jako již nepotřebná, ale už na nějakém vlákně běží. Tady to nejspíš rozložím na možnost, kdy jde spuštěnému kódu předat, že se má ukončit a pokud to nelze, tak vlákno na tvrdo zničit a udělat nové... což ale může vést k problémům. Řešením by také bylo nechat akci doběhnout, pokud nebude trvat dlouho, tady ale zase nemam žádnou predikci za jak dlouho může akce skončit. Jak (pokud) možnost předčasného ukončení Tasku řeší ThreadPool?

Nahlásit jako SPAM
IP: 88.100.186.–
KIIV
~ Moderátor
+43
God of flame
6. 3. 2020   #4
-
0
-

#3 Kartmen
Thread pool to neresi. To resi ten task. Thread pool vlastne resi jen ukonceni vsech threadu, po dokonceni tasku.

Na vlaknu bezi akorat loop (s testem jestli nema skoncit vlakno), a ceka na signal od semaforu. Jakmile prijde signal, vyjme polozku z fronty a zavola neco z jejiho rozhrani, dejme tomu metodu  run();  v ni je pak samotny vypocet, ktery by melo jit nejak ukoncit. Muze to byt pomoci nejake dalsi metody, ktera zmeni neco uvnitr toho tasku a tim prerusi vypocet (pokud to jde). Samozrejme, pokud tam vyuzivas nejake knihony, kde jen neco predas a ono to pak kdo vi jak dlouho pocita, tak to jen tak predcasne neukoncis. Tu predcasnou ukoncitelnost si musis naprogramovat sam.

Po dokonceni/preruseni tasku se muze predat do dalsi fronty (opet muze byt se signalizaci), a tu frontu pak akorat zpracovavas.

Nahlásit jako SPAM
IP: 37.48.58.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kartmen
~ Anonymní uživatel
57 příspěvků
6. 3. 2020   #5
-
0
-

Ok. Ještě menší dotaz na Visual Studio, neznáte někdo dobrý způsob (Addon), na ladění více vláken, kdy chci sledovat jen jedno, nebo několik vybraných vláken a ostatní ne? Zatím jsem vygoogloval jen nic moc řešení, kdy se dají breakepointy na každý řádek a nastaví se podmínka na thread, který chci ladit. 

Nahlásit jako SPAM
IP: 88.103.206.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 24 hostů

Podobná vlákna

Jak ukončit if bez returnu — založil Draffix

[Java6]Jak ukoncit thread? — založil shadius

Jak ukončit jinou aplikaci — založil Hula

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý