ITnetwork Flashka zdarma C a C++ týden
Akce! Pouze tento týden sleva až 80 % na kurzy C++. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: Jak vykreslovat na canvas z vedlejšího vlákna | WPF

Aktivity (4)
Avatar
Petr Novotný:31.3.2018 17:46

Ahojte, snažím se vytvořit hru ve WPF.
Mám tam zatím tři třídy, které by měli reprezentovat nějaké enginy (DrawingEngine, CollisionEngine, PhysicsEngine).
Jelikož potřebuju, aby mi instance těchto objektů běžely v infinity loop, tak jsem pro to vytvořil nové vlákno s nejvyšší prioritou.

Funkce, které se pořád vykonává je následující:

private void ThreadMethod()
{
    while (true)
    {
        foreach (IEngine engine in engines)
        {
            if (engine is DrawingEngine)
            {
                gameArea.Dispatcher.Invoke(() => { engine.run(); });
            }
            else
            {
                engine.run();
            }
        }
    }
}

[gameArea = canvas]
Někde na internetu jsem četl, že když zavolám

gameArea.Dispatcher.Invoke(() => { engine.run(); });

, tak by mě mělo jít vykreslovat z vedlejšího vlákna do designu.
Řekněme, že mi ten DrawingEngine zavolá následující funkci:

public override void render(UIElementCollection UIElement)
{
    Rectangle rectangle = new Rectangle();
    rectangle.Margin = new Thickness(X, Y, 0, 0);
    rectangle.Width = Width;
    rectangle.Height = Height;

    rectangle.Stroke = new SolidColorBrush(Colors.Black);

    UIElement.Add(rectangle);
}

Stane se to, že se mi zaseká hlavní vlákno aplikace a stejně se nic nevykreslí.
Nevíte někdo jak na to ?
Díky moc

 
Odpovědět 31.3.2018 17:46
Avatar
Miroslav Majcher:31.3.2018 18:21

Ahoj,
len v rychlosti:

  1. UIElement.Add -> UIElement je v tomto pripade canvas 'gameArea'?
  2. skus, napr. cez breakpoint, zjistit, ci sa zvacsuje Children.Count u gameArea, ak ano a ty nic nevidis, tak by som skusil overit, zda sa vobec spusta OnApplyTemplate(), ale ty tam pridavas iba Rectangles, tak je to asi jedno.

M.

 
Nahoru Odpovědět 31.3.2018 18:21
Avatar
Petr Novotný:31.3.2018 18:35

UIElement je canvas.Chileden

 
Nahoru Odpovědět 31.3.2018 18:35
Avatar
Odpovídá na Petr Novotný
Miroslav Majcher:31.3.2018 20:39

A co bod 'b'?
Cez breakpoint, alebo cez 'Live Visual Tree' zistit, zda su nove elementy pridane do kolekcie Children?

 
Nahoru Odpovědět 31.3.2018 20:39
Avatar
zelvicek
Člen
Avatar
Odpovídá na Petr Novotný
zelvicek:1.4.2018 14:02

Nemám odpověď na tvůj dotaz, ale IMHO je lepší z work threadu zařadit do fronty hlavního okna custom event (viz win32 funkce PostMessage) a upravit si WndProc.

 
Nahoru Odpovědět 1.4.2018 14:02
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 5 zpráv z 5.