Avatar
Jan Demel
Redaktor
Avatar
Jan Demel:

Č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
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:

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:

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:

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ý:

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):

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):

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:

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:

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:

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.