Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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
Jan Bezdíček
Tvůrce
Avatar
Jan Bezdíček:4.1.2017 7:40

Cus, zacinam po dlouhe dobe s C# opet a mam mensi problem :) Vytvorim si instanci teto tridy:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media;

namespace RPlayer.Classes
{
    class RadioManager : MediaPlayer
    {
        public bool isPlaying { get; private set; } = false;
        public new double Volume { get { return base.Volume * 100; } set { base.Volume = value / 100; } }

        public RadioManager() : base()
        {
            this.MediaOpened += RadioManager_MediaOpened;
            this.Open(new System.Uri("http://icecast3.play.cz/evropa2-128.mp3"));
        }

        private void RadioManager_MediaOpened(object sender, EventArgs e)
        {
            this.Play();
        }

        public new void Play()
        {
            if (!this.isPlaying)
            {
                base.Play();
                this.isPlaying = true;
            }
        }

        public new void Pause()
        {
            if (this.isPlaying)
            {
                base.Pause();
                this.isPlaying = false;
            }
        }
    }
}

Ale problem je, ze event RadioManager_Me­diaOpened se spusti jen pokud pomalu krokuju v debuggeru. Kdyz necham program bezet, radio nezacne hrat. Asi je to tim, ze metoda Open je asynchronni a GC mi tu instanci te tridy sezere driv nez se stihne vypalit ten event.

Tahle instance bude jen jedna (zadne poznamky o singletonu nechci slyset :D), nemate tuseni jak ji nechat "zit" po cely beh aplikace ?

 
Odpovědět
4.1.2017 7:40
Avatar
Jan Bezdíček
Tvůrce
Avatar
Jan Bezdíček:4.1.2017 7:51

Tip cislo dve je, ze mi to bezi v UI threadu ta instance ze ktere hraje radio a nic nehraje, protoze to blokuje to UI. V tom pripade nemam uz vubec tuseni jak s tim nalozit :D

 
Nahoru Odpovědět
4.1.2017 7:51
Avatar
Luboš Běhounek Satik:4.1.2017 10:07

Co si tu instanci udržovat normálně u jaký hlavní herní třídy po celou dobu? :)

Nahoru Odpovědět
4.1.2017 10:07
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Jan Bezdíček
Marian Benčat:4.1.2017 10:24

NO a kde tu instanci mas vytvorenou? Kdyz myslis, ze ti to sezere GC, tak by bylo fajn ukazat, kde se ta instance vytváří,.. ale předem říkám, že je to super nepravděpodobný :-)

Nahoru Odpovědět
4.1.2017 10:24
Totalitní admini..
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Marian Benčat
Jan Bezdíček:4.1.2017 13:37

Uz vyreseno, nevim, jestli to je nejcistsi reseni ale bylo to tim, ze jakmile se zaplo WPF okno, blokoval ten MediaPlayer onen UI thread.

Jinak instanci sem tvoril primo v konstruktoru MainWindow (WPF).

Tohle pomohlo:

Thread rManagerThread = new Thread(() =>
    {
        this.rm = new RadioManager();
        System.Windows.Threading.Dispatcher.Run();
    });
    rManagerThread.SetApartmentState(ApartmentState.STA);
    rManagerThread.IsBackground = true;
    rManagerThread.Name = "RadioManager";
    rManagerThread.Start();

Konkretne to zachranil

System.Windows.Threading.Dispatcher.Run();

Coz me trosku mate, proc je to vytvoreni noveho Dispatcheru v tom vlakne tak "kriticke", aby se to neblokovalo s UI threadem

 
Nahoru Odpovědět
4.1.2017 13:37
Avatar
Neaktivní uživatel:4.1.2017 15:23

MediaPlayer dědí z Dispatcher object, to znamená, že potřebuje aktivovaný message pumping (jakmile je vyvolán ten event, je umístěn do MSG queue a předán vláknu, které vytvořilo MediaPlayer, aby ten event vykonalo. Jenomže tvoje nové vlákno tento message pumping neprovádí, dokud právě nezavoláš Dispatcher.Run().

Pokud to nezavoláš, tak by se měl MediaPlayer zavřít (stejně jako kdybys vytvořil třeba Window na vedlejším vlákně), právě proto, že není aktivní Dispatcher, takže vlákno prostě skončí.

Editováno 4.1.2017 15:25
Nahoru Odpovědět
4.1.2017 15:23
Neaktivní uživatelský účet
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 7 zpráv z 7.