Diskuze: Nějaké jiné řešení? C#

C# .NET .NET (C# a Visual Basic) Nějaké jiné řešení? C# American English version English version

Avatar
Dejvos
Člen
Avatar
Dejvos:

Ahoj napadlo mě si vyzkoušet jak bude vypadat pohyb PB když bude přesně po 1ms ne jako ve WF timerech.A vzniklo tohle: http://mojesoubory.funsite.cz/stopwatchf.exe
Jenže je problém že po "uspání" se nedá nic jiného dělat a proto by mě zajímalo jestli by se to nedalo udělat nějak jinak aby to mělo stejný efekt ale nezabraňovalo to v dělání jiných věcí..Pokud to někoho zajímá tak zdroják je zde:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace stopwatchf
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Stopwatch stopwatch = new Stopwatch();
        int y = 0;
        int x = 0;
        int kolik = 0;
        int f = 0;
        int hcas = 0;
        int spi = 1;
        int speed = 1;
        private void Form1_Load()
        {
            while (pb.Left < 1000)
            {
                f++;
                stopwatch.Start();
                if (stopwatch.ElapsedMilliseconds >= kolik)
                {
                    posun();
                    stopwatch.Stop();
                    stopwatch.Reset();
                }
            }
        }
        public void posun()
        {
            Thread.Sleep(spi);
            x++;
            pb.Left+=speed;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            hcas++;
            lfps.Text = (f/hcas).ToString();
            lf.Text = f.ToString();
        }


        private void timer2_Tick(object sender, EventArgs e)
        {
            if (pb2.Left < 1000)
            {
                pb2.Left += speed;
            } if (x == 0)
            {
                Form1_Load();
            }
        }
    }
}

Dík za případný nápady nebo názory :D

Odpovědět 9.3.2014 21:26
Neodsuzuj někoho za to co něco neumí, ale uznávej ho za to co umí.Čest nade vše.
Avatar
Odpovídá na Dejvos
RickettsialPox:

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.mi­crosoft.com/en-us/library/sys­tem.windows.for­ms.timer(v=vs­.110).aspx"

Pokud se nesnažíš o časovač, ale jen o zpožďění, použij System.Threadin­g.Thread.Sleep­...

Editováno 9.3.2014 21:39
Nahoru Odpovědět 9.3.2014 21:37
Nikdy nikdo nikým není, dokud nevěří.
Avatar
Dejvos
Člen
Avatar
Odpovídá na RickettsialPox
Dejvos:

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ě.

Editováno 9.3.2014 21:45
Nahoru Odpovědět 9.3.2014 21:43
Neodsuzuj někoho za to co něco neumí, ale uznávej ho za to co umí.Čest nade vše.
Avatar
Odpovídá na Dejvos
Matyáš Černohous (Matesak):

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.

 
Nahoru Odpovědět 9.3.2014 21:44
Avatar
Odpovídá na Dejvos
Matyáš Černohous (Matesak):

Vytvoříš nové vlákno a spustíš.

Thread thr2 = new Thread(() => Posun());
thr2.Start();
 
Nahoru Odpovědět 9.3.2014 21:47
Avatar
Odpovídá na Dejvos
RickettsialPox:

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.Threadin­g.Timer:

"http://msdn.mi­crosoft.com/cs-cz/library/sys­tem.threading­.timer(v=vs.110)­.aspx"

Matyáš Černohous (Matesak)

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ářů...

Editováno 9.3.2014 21:51
Nahoru Odpovědět 9.3.2014 21:49
Nikdy nikdo nikým není, dokud nevěří.
Avatar
Dejvos
Člen
Avatar
Odpovídá na RickettsialPox
Dejvos:

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.

Nahoru Odpovědět 9.3.2014 22:00
Neodsuzuj někoho za to co něco neumí, ale uznávej ho za to co umí.Čest nade vše.
Avatar
Odpovídá na Dejvos
RickettsialPox:

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.

Nahoru Odpovědět 9.3.2014 22:05
Nikdy nikdo nikým není, dokud nevěří.
Avatar
Dejvos
Člen
Avatar
Odpovídá na RickettsialPox
Dejvos:

Takže získat 1ms interval jiným způsobem než tímhle nejde?

Nahoru Odpovědět 9.3.2014 22:09
Neodsuzuj někoho za to co něco neumí, ale uznávej ho za to co umí.Čest nade vše.
Avatar
Odpovídá na Dejvos
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...

Nahoru Odpovědět 9.3.2014 22:12
Nikdy nikdo nikým není, dokud nevěří.
Avatar
Dejvos
Člen
Avatar
Odpovídá na RickettsialPox
Dejvos:

Dobře dík tohle mě zajímalo a nakonec jsme k tomu došli :D 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í...

Nahoru Odpovědět 9.3.2014 22:17
Neodsuzuj někoho za to co něco neumí, ale uznávej ho za to co umí.Čest nade vše.
Avatar
Odpovídá na Dejvos
RickettsialPox:

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...

Editováno 9.3.2014 22:25
Nahoru Odpovědět 9.3.2014 22:23
Nikdy nikdo nikým není, dokud nevěří.
Avatar
Odpovídá na Dejvos
Michal Štěpánek:

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

Nahoru Odpovědět 10.3.2014 8:48
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Dejvos
Luboš Běhounek (Satik):

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();
  • tenhle kód se postará o to, aby se prováděla i nadále obsluha formuláře.

Matyáš Černohous (Matesak) :
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/…timers.timer(v=vs.110).aspx a http://msdn.microsoft.com/….forms.timer(v=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..."

  • Uh, to je blábol... :D

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 QueryPerforman­ceCounter.

Dejvos :
"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."

  • Dovolil bych si nesouhlasit, je to dost vyrovnané, na něco je rychlejší Java, na něco C# a také záleží na tom, na jakém OS se to testuje.

Na Windows bych si dokonce troufal tvrdit, že je v průměru celkově o něco málo rychlejší C#.

Nahoru Odpovědět  +4 10.3.2014 16:16
:)
Avatar
Dejvos
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Dejvos:

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. :D 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í.

Nahoru Odpovědět 14.3.2014 23:23
Neodsuzuj někoho za to co něco neumí, ale uznávej ho za to co umí.Čest nade vše.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Dejvos
Jan Vargovský:

Protože nemůžeš z jednoho vlákna šahat na proměnné druhého vlákna.

 
Nahoru Odpovědět 14.3.2014 23:46
Avatar
Odpovídá na Dejvos
Luboš Běhounek (Satik):

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.

Editováno 15.3.2014 15:15
Nahoru Odpovědět 15.3.2014 15:14
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.