Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 11. květen 2009, 10:34:10 Předmět: Pozastavení vlákna |
|
|
mám následující aplikaci,
metoda main, spustí postupně dvě další vlákna a já potřebuju aby každé jelo jen určitou dobu (třeba 500ms) a pak se pozastavilo (tzn zůstalo stát na té instrukci kde skončilo) a pokračovalo druhý vlákno, a tak pořád dokola
ten kód v tom vláknu může být jakejkoliv takže klidne i while(true) { }, takže se nemůžu spoléhat na to že odchytí nějakou mou zprávu a vypne se kvůli ní.
ty dvě vedlejší vlákna zarás nepojedou, vždy jen hlavní + jedno vedlejší
(myslel sem že něco podobnýho může dělat thread.suspend, ale nejak pisou ze se to enma pouzivat protoze se pak vlakna dostavaji do deadlocku, a kdyz to pouziju tak se mi vlakna zaseknou )
dá se vubec nějak pozastavit vlákno od jinud než z toho vlákna? mám na tohle vůbec používat vlákna? dik
ve zkratce něco takovýho
kód: |
main()
{
foreach (Therad t in threads)
{
t.Unpause()
Thread.Sleep(500)
t.Pause()
}
}
|
|
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 11. květen 2009, 11:42:19 Předmět: Re: Pozastavení vlákna |
|
|
Sosarian napsal: |
dá se vubec nějak pozastavit vlákno od jinud než z toho vlákna? mám na tohle vůbec používat vlákna? |
Napiš, čeho chceš dosáhnout |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 11. květen 2009, 11:46:25 Předmět: |
|
|
mam vlákno a v nem běží while(true) {} chci ho z jinyho vlakna pauznout a pak odpauznout od toho mista kde sem ho pauzl
jako cely to ma byt pro to ze se pousti metoda (v tom prvnim vlakne) ktera ovlada panacka (neco jako ai) a rika "zacni jit do leva", "zacni strilet",
a na to aby mu rekl a co ma delat ma omezenej cas,
a pak se ma pustit dalsi metoda (v tom druhym vlakne) ktera rika co ma delat jinymu panackovy
de o to aby ta metoda nemela neomezenej cas na rozhodnuti co se bude dit a nebo tam nekdo nemohl napsat nekonecnej cyklus a zastavit hru |
|
Návrat nahoru |
|
|
sulthan
Založen: 24. 10. 2007 Příspěvky: 104
|
Zaslal: 11. květen 2009, 12:16:11 Předmět: |
|
|
no, systemovy vlakno se ti nikdy nezastavi tam, kde budes chtit. To proste nepujde. Nemluve o tom, ze pauzovat vlakno z jineho vlakna se mi zda na jednoprocesoru docela blbost
Udelej to jinak... primo v tom vlakne si kontroluj, jestli to vlakno uz nebezelo moc dlouho a kdyztak at se samo ukonci.
Uvedom si, co to znamena "vlakno", jak se chova... a ze ve vetsine pripadu ti najednou pobezi skutecne jen jedno jedine vlakno (uz ten for cyklus pres hromadu vlaken me docela zarazil). |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 11. květen 2009, 12:22:59 Předmět: |
|
|
Jestli jsem to dobře pochopil, tak děláš na nějakém skriptování pro nějakou hru, přičemž chceš zajistit, aby skript (reprezentovaný metodou, která se spustí ve svém vlákně) běžel jen určitou dobu. Je to tak?
To je docela složitá věc, protože se nemůžeš spolehnout na to, co kdo do skriptu napíše. Jediné řešení, které mě napadá, je proložit si CIL kód testováním, zda nemá být vlákno pozastaveno (což nebude jednoduché). Ale možná Ti jde o něco jiného... |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 11. květen 2009, 12:33:41 Předmět: |
|
|
Chápu to stejně jako Augi. Přemýšlím, jak jsme to řešili my ve škole při soutěži ActiveX komponent dámy ve webovém prohlížeči... asi vytvořením vlákna a jeho killnutím po uplynutí času (s tím že pro každý další tah se mu posílala situace na hrací ploše, to bys mohl udělat taky, načítat a předávat celý herní stav) _________________
|
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 11. květen 2009, 12:35:20 Předmět: |
|
|
2sulthan: no jak sem psal v tom vlakne muze bezet cokoliv a ja nejsem ten kdo ho pise, nejde o to abych to zastavoval presne na ms, ale aby to nebezelo 5 sec misto 1
vim ze zaras bezi jen jedno vlakno, ale i v tom nekonecnym cyklu to obcas vyskoci a necha to bezet jiny vlakno
2Augi: to je chytry, stacilo by to dat pred vsechny skoky a treba za kazdou 10tou instrukci
de tu o to co sem psal nahore, dve AI se jedna po druhe rozhoduji co bude delat (maji na to omezenej cas) a az se rozhodnou v hlavni smycce se pusti neco co simuluje par sec hry, a pak se zas rozhodujou
2Mem: jo tak to mam ted, ale moc se mi nelibilo porad vytvaret novy vlakno |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 11. květen 2009, 12:41:41 Předmět: |
|
|
No problém je, že bys musel tím testem proložit nejen instrukce v metodě, ale také instrukce ve všech metodách, které ta hlavní skriptovací metoda volá. Nebo zakázat volání jiných metod ze skriptu (to bys mohl ohlídat během generování nového kódu metody). Každopádně by to bylo pěkné cvičení na CIL |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 11. květen 2009, 12:41:59 Předmět: |
|
|
IRC napsal: |
[13:38] Memoza: AugiTreballant: my jsme navic meli ty komponenty umyslne udelane tak, ze vypocet bezel v samostatnem vlakne, a verejne rozhrani vracelo na pozadani v tu chvili nejlepsi tah (takze prohledavani do hloubky postupne vracelo lepsi tahy a zalezelo do jake urovne to stihlo)
[13:40] AugiTreballant: Memoza, hehe, to je taky dobry
[13:40] AugiTreballant: Memoza, ze to na prvni pohled vypada hrozne slozite, ale vlastne je to uplne jednoduche
[13:40] Memoza: jj |
_________________
|
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 11. květen 2009, 12:43:38 Předmět: |
|
|
Btw. pokud má strach z výkonu kvůli vytváření nového vlákna, tak mrkni na ThreadPool. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 11. květen 2009, 12:44:25 Předmět: |
|
|
2Augi:
no ted nedavno sem si napasl interpret kterej zvladal dost instrukci, takze to problem nebude
http://grim.havoc.sweb.cz/CLI.jpg
stejne sem to chtel prohlizet a kontrolovat jestli nevolaji reflexy, nebo nevytvari dalsi vlakna apod
Naposledy upravil Sosarian dne 11. květen 2009, 12:48:02, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 11. květen 2009, 12:52:56 Předmět: |
|
|
do expression tree dostanu snad jen lambda vyraz, ne jakoukoliv metodu, ne? |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 11. květen 2009, 12:59:20 Předmět: |
|
|
Jj, ani lambda expression se statement body tam neprotlačíš. Takže jako nejuniverzálnější opravdu vidím to generování CILu. A pokud máš CIL už nastudovaný, tak to myslím nebude až zas takový problém. Pak se pochlub s výsledkem |
|
Návrat nahoru |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 11. květen 2009, 13:57:21 Předmět: |
|
|
Neprocital jsem diskuzi, ale kdyz uz budes vkladat CIL instrukce, byt tebou bych se podival, jak se to resi u yield return (coz je zpusob, jak de facto mit vic nezavislych zasobniku v jednom vlakne). _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
|