Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

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

C# .NET .NET (C# a Visual Basic) Jak vykreslovat na canvas z vedlejšího vlákna | WPF American English version English version

Aktivity (3)
Avatar
Petr Novotný:31. března 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. března 17:46
Avatar
Miroslav Majcher:31. března 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. března 18:21
Avatar
Petr Novotný:31. března 18:35

UIElement je canvas.Chileden

 
Nahoru Odpovědět 31. března 18:35
Avatar
Odpovídá na Petr Novotný
Miroslav Majcher:31. března 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. března 20:39
Avatar
zelvicek
Člen
Avatar
Odpovídá na Petr Novotný
zelvicek:1. dubna 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. dubna 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.