Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Okno se mi pozdě objevuje

C# .NET .NET (C# a Visual Basic) Okno se mi pozdě objevuje American English version English version

Aktivity (1)
Avatar
Jan Demel
Redaktor
Avatar
Jan Demel:6.2.2014 21:09

Čau lidi. Rozhodl jsem se zkusit udělat program, který vygeneruje level, potom 10s počká a načte další. K čemu je to dobré se mě neptejte :D Je to celkem složitá záležitost. Je tu ale problém. Mám vytvořenou třídu gameCore, kde je zatím generování levelů a freeze kódu na 10s (já to mám jako metodu waitTenSeconds(Je to jenom kvůli přehlednosti a ujasnění)) no ale co se stane je to, že program nejdříve počká 10s a až potom se mi objeví okno. Prosím vás moc čím to může být a jak to mám fixnout ?

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

namespace BrainTest
{
    public partial class game : Form
    {

        gameCore core = new gameCore();

        public game()
        {
            InitializeComponent();
            pictureBox1.Image = core.generateLevel();
        }

        private void game_Load(object sender, EventArgs e)
        {
            core.waitTenSeconds();
            MessageBox.Show("Tohle se objeví až po 10s. Bohužel zároveň s oknem game");
        }

        private void game_Closing()
        {

        }
    }
}
Odpovědět 6.2.2014 21:09
To co se zdá být nemožné, je vždy možné.
Avatar
Odpovídá na Jan Demel
Michal Žůrek (misaz):6.2.2014 21:16

vyzkoušej Timer.

Nahoru Odpovědět 6.2.2014 21:16
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jan Demel
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Jan Demel:6.2.2014 21:20

Tohle je současná metoda waitTenSeconds()

public void waitTenSeconds()
        {
            DateTime time = DateTime.Now.AddSeconds(10);

            bool timeOver = false;
            DateTime actualTime;

            while (timeOver == false)
            {
                actualTime = DateTime.Now;
                if (actualTime >= time)
                {
                    timeOver = true;
                    MessageBox.Show("Cas vyprsel");
                }
            }
        }

Nedá se tam nějak připsat třeba this.Show(); nebo něco podobného ? S timerem jsem ještě nikdy nepracoval.

Nahoru Odpovědět 6.2.2014 21:20
To co se zdá být nemožné, je vždy možné.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jan Demel
Petr Nymsa:6.2.2014 21:36

Sice Timer lze použít, ale mnohem lepší a jednodušší -> Timer.Sleep()

Nahoru Odpovědět 6.2.2014 21:36
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Demel
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jan Demel:6.2.2014 21:38

To jsem používal předtím. Ono to udělá to samé co tohle.

Nahoru Odpovědět 6.2.2014 21:38
To co se zdá být nemožné, je vždy možné.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Jan Demel
Jan Vargovský:6.2.2014 21:44

Však to udělej v jiném vlákně přes backgroundworker.

 
Nahoru Odpovědět 6.2.2014 21:44
Avatar
Odpovídá na Jan Demel
Luboš Běhounek (Satik):6.2.2014 21:45

Do čekací smyčky přidej

Application.ProcessMessages();
  • ten MessageBox za waitem se sice ani tak nezobrazí, ale form by se měl zobrazit a reagovat.
Nahoru Odpovědět 6.2.2014 21:45
:)
Avatar
Luboš Běhounek (Satik):6.2.2014 21:48

Jinak nejsem si teď jistej, kdy přesně se Load volá, jestli to ještě nebudeš muset z load přesunout třeba to Show nebo do timeru.

Případně to úplně vyřeší druhé vlákno :)

Nahoru Odpovědět 6.2.2014 21:48
:)
Avatar
Jan Demel
Redaktor
Avatar
Nahoru Odpovědět 6.2.2014 22:04
To co se zdá být nemožné, je vždy možné.
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Jan Demel
hanpari:6.2.2014 22:20

Nebude ti stačit tohle:

private void game_Load(object sender, EventArgs e)
         {
             //Zobrazíš formulář
             this.Show();
             //Počkáš 10 vteřin
             core.waitTenSeconds();
             MessageBox.Show("Tohle se objeví až po 10s. Bohužel zároveň s oknem game");
         }
 
Nahoru Odpovědět 6.2.2014 22:20
Avatar
Jan Demel
Redaktor
Avatar
Odpovídá na hanpari
Jan Demel:8.2.2014 13:32

Né tohle opravdu nestačí ;)

Nahoru Odpovědět 8.2.2014 13:32
To co se zdá být nemožné, je vždy možné.
Avatar
Honza
Člen
Avatar
Honza:11.2.2014 14:58

Udělal bych to v jiném vlákně, časově náročnější operace by neměly být v hlavním vlákně, protože to slouží pro vykreslování a zachytávání eventů UI.

Vlákna si můžeš buď vytvářet ručně a nebo to jde pohodlnějí přes background worker, který umožňuje v události "Report progress" přistupovat i k UI (což standardně z jiného vlákna nejde).

Nahoru Odpovědět 11.2.2014 14:58
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
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 12 zpráv z 12.