IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
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
Neaktivní uživatel: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
Neaktivní uživatelský účet
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ý
Neaktivní uživatel: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
Neaktivní uživatelský účet
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.