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é?
Fórum › .NET
Vlákna, jak je ukončit
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.
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?
#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.
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.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak ukončit if bez returnu — založil Draffix
[Java6]Jak ukoncit thread? — založil shadius
Jak ukončit spojení s klientem — založil Skřivy
Jak ukončit jinou aplikaci — založil Hula
Jak ukončit nekonečnou smyčku? Do....Loop — založil Siopaulo
Moderátoři diskuze