Diskuze: Nějaké jiné řešení? C#
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Podívej, pokud nenapíšeš jedinou větu, co bude dávat smysl, nevím jak ti mám pomoci. Pokusím se - stopwatch - to je tedy nějaký odpočet? Snažíš se o časovaný suspend? (režim spánku) Veškeré proměnné intervalu co tam máš, má samotný časovač Forms. Lze z něj dostat i TimeSpan...
"http://msdn.microsoft.com/en-us/library/system.windows.forms.timer(v=vs.110).aspx"
Pokud se nesnažíš o časovač, ale jen o zpožďění, použij System.Threading.Thread.Sleep...
Snažím se o interval 1ms který ale nebude pozastavovat všechny ostatní věci v projektu jako Thread.Sleep.(1);
EDIT: jinak ten Stopwatch si můžeš z kódu odmyslet byl tam protože jsem to zkoušel přes něj ale teď je tam zbytečně.
Moc jsem nepochopil, co přesně potřebuješ, ale pokud ti jde o to, aby si i po "uspání" pohybu mohl s aplikací pracovat, tak si vytvoř nové vlákno a pusť to v něm. Bude ti to dělat co potřebuješ a s aplikací půjde normálně pracovat.
Vytvoříš nové vlákno a spustíš.
Thread thr2 = new Thread(() => Posun());
thr2.Start();
Přečti si důkladně mou odpověď. Sleep není časovač, ale uspání vlákna - v tomto případě hlavního vlákna. Zato Timer, to je jiná. I vlákna mají časovače - viz. System.Threading.Timer:
"http://msdn.microsoft.com/cs-cz/library/system.threading.timer(v=vs.110).aspx"
Raději bych se tu přestal bavit o vláknech, nechci ho zatěžovat něčím tak složitým, co ani já tolik nepoužívám. Ať se vykašle na vlákna - stačí časovač formulářů...
Právě že já bych nechtěl používat timer protože ikdyž ho ve WF
nastavíš na 1ms tak se k 1ms ani zdaleka nepřibližuje a pomocí toho že
jsem tam dal ten Thread.Sleep(1) tak jsem 1ms dosáhl (aspoň myslím).
Stáhni si ten projekt a uvidíš rozdíl v timeru a Thread.Sleepu...
Jinak k tomu vláknu:::
Additional information: Operace mezi vlákny není platná: Přístup k
ovládacímu prvku pb proběhl z jiného vlákna než z vlákna, v rámci
kterého byl vytvořen.
Tohle bez znalosti vláken nepůjde. Pak se tedy v příslušné sekci nauč používat vlákna, načež jednoduše uspi odnož, místo hlavního vlákna.
Takže získat 1ms interval jiným způsobem než tímhle nejde?
Jde, jen ne v C# - to je vyšší jazyk, který nedokáže využít strojového časovače. (Místo toho se napíchne na nějakou službu/démona.) Však si projdi tu sekci o vláknech a pak vytvoř vlákno, které uspíš na 1ms - nevidím problém...
Dobře dík tohle mě zajímalo a nakonec jsme k tomu došli na ty vlákna se podívám a
zkusím to tak udělat.Jinak co se vlastně vyvíjí v C#? Má dost věcí
který se v něm nedaj udělat, neumí pořádně využít výkon CPU, pomocí
DotPeeks se dekompiluje pomocí jednoho kliknutí...
Naopak C# je na svou vysokou úroveň přijatelně výkonné.O něco rychejší je jen Java. (krom startu) Jde v něm vše, jako v každém jiném jazyce. Vždy jde jen o kompilátor, interpret... COSMOS, SharpOS - operační systémy. ASP + .NET = ASP.NET - 90% lidí píše v C#. WebSockets konzole - 40% C#. Atd. Stejně tak v LISPu, v K, D, J#, X++, Chef, LOLCODE, 4FUCK, Euro, Lolololo, AAAAAAAAAAAAAA!!!!, [], Fish, 4., (whitespace) atd. V jakémkoliv esoterickém, či jiném jazyce jde teoreticky vše. Jen jsou některé jazyky vhodnější na ... Jiné nejsou vhodné pro ... Ale vždy je to jen o vůli, ochotě, schopnostech...
Zkus se podívat na komponentu "Backgroundworker", to je řešení tvého
problému. Jednoduše tím pustíš operaci v jiném vlákně( jako na pozadí)
a jinak aplikace funguje bez problémů i po dobu "té" operace.
Na mstv.cz je i videonávod na použití této komponenty
Uh, máte tu v diskuzi spoustu nepřesností, nejasností a přímo i věcí, co neplatí, tak vám v tom zkusím udělat pořádek:
Do toho cyklu přidej kód
Application.ProcessMessages();
Matyáš Černohous :
Vytvářet vlákno, co má jen něco dělat s GUI formuláře je zbytečné,
stejně nemůžeš přímo z toho vlákna šahat na formulář.
RickettsialPox :
Pozor, neplést http://msdn.microsoft.com/…vs.110).aspx a http://msdn.microsoft.com/…vs.110).aspx
Timer z timers má svoje vlákno, zatímco Timer z Forms (který se běžně
používá) svoje vlákno nemá a vše spouští v hlavním vlákně
formuláře.
K intervalu Timeru: Tick Timeru je vyvoláván přerušením procesoru, je to defaultně cca 15ms (dá se to změnit, ale nepoužívá se to), takže Timer má prostě omezenou přesnost, pod kterou se nedostaneš.
RickettsialPox :
"Jde, jen ne v C# - to je vyšší jazyk, který nedokáže využít strojového
časovače. (Místo toho se napíchne na nějakou službu/démona.) Však si
projdi tu sekci o vláknech a pak vytvoř vlákno, které uspíš na 1ms -
nevidím problém..."
Samozřejmě, že v C# jde využít vyšší přesnost, buďto přes DateTime.Ticks, třídu StopWatch nebo přinejhorším můžeš využít WINAPI a použít QueryPerformanceCounter.
Šeryx :
"Jinak co se vlastně vyvíjí v C#?"
V podstatě všechno kromě OS a driverů (resp. i to by šlo, ale musel bys
nejdřív v jiném jazyce si pro to napsat loader).
RickettsialPox :
"O něco rychejší je jen Java."
Na Windows bych si dokonce troufal tvrdit, že je v průměru celkově o něco málo rychlejší C#.
Ahoj co jsem já zjistil tak:
Application.ProcessMessages();
(v Delphi) je v C#:
Application.DoEvents();
jinak "Však si projdi tu sekci o vláknech a pak vytvoř vlákno, které
uspíš na 1ms - nevidím problém..." žádnou sekci o vláknech v C# jsem tu
nenašel. A když jsem s
těmi vlákny něco zkoušel dělat tak mne to do Formu nepustí ani posunout
nějakou kontrolku takže to buď dělám špatně, nebo to není řešení.
Protože nemůžeš z jednoho vlákna šahat na proměnné druhého vlákna.
Jj, dělá to v podstatě to samé, dřív jsem dělal v Delphi, tak jsem
napsal omylem tu verzi z Delphi, ale jinak to dělá to samé .
WinFormy (V C#, Delphi i třeba C++) fungují tak, že když máš třeba na formu událost OnMouseMove a pohneš nad ním myší, tak Windows pošle tvojí aplikaci zprávu, že se pohlo myší a až se tahle zpráva zpracuje, tak se teprve spustí událost OnMouseMove.
Form běží ve vlastním vláknu a tu frontu událostí zpracovává automaticky ve volné chvíli a nebo právě pokud zavoláš DoEvents().
Pokud je nějaká tvá funkce delší, tak v tu chvíli form provádí tvůj kód a nemůže tedy zpracovávat tu front zpráv.
K těm vláknům - jak jsem psal výše, v diskuzi tu bylo pár nepřesností a vytvářet druhé vlákno jen kvůli ovládání GUI nemá moc smysl, protože stejně z jiných vláken nemáš na to GUI přístup.
Jan Vargovský : Jen to upřesním, mezi vlákny samozřejmě na proměnné šahat můžeš, ale zrovna u GUI je to složitější - právě kvůli tomu, že je tam spousta věcí řešena přes ty zprávy.
Zobrazeno 17 zpráv z 17.