reklama

Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - zemla

Stran: [1]
1
Vývoj / GitHub: fork vs. vlastní branch
« kdy: 05. 06. 2019, 22:40:42 »
Dobrý den,

mám v plánu založit si novou odnož produktu, který je pod MIT na githubu.

Jejich produkt se už nevyvíjí, ale sem tam se tam objeví nějaký ten bugfix.

Svoji odnož chci rozšířit o něké ty nové funkcionality.

K tomuto je tedy prosím určen fork? A pokud ano, půjde do něj namergovat nějaký ten bugfix z původní větve ?

Díky.

2
Vývoj / Re:C# a přístup k parametru delegáta
« kdy: 27. 04. 2019, 14:21:03 »
OK, async je v tomto případě zbytečné.

Generikum potřebuju, protože každé API, což jsem zapoměl napsat, že jich máme víc a každý s vlastním odvozeným requestem, vrací pokaždé jinou response.

Mám to jako zjednodušený příklad takto:

Kód: [Vybrat]
public class MultipleRequest
    {
        public MultipleRequest(int take, int skip)
        {
            Take = take;
            Skip = skip;
        }
        public int Take { get; set; }
        public int Skip { get; set; }
    }

    public class SearchByNameRequest : MultipleRequest
    {
        public SearchByNameRequest(string name, int take = 50, int skip = 0)
            : base(take, skip)
        {
            Name = name;
        }
        public string Name { get; set; }
    }

    public class PaginationHelper<TR>
    {
        public delegate Task<TR> SearchMethodDelegate(MultipleRequest multipleRequest);

        public static async Task<TR> GetResultFromSearchAsync(SearchMethodDelegate task, Func<TR,bool> checker, int paging = 50)
        {
            int take = paging;
            int skip = 0;

            TR getterValue;

            do
            {
                var parameterInfo = task.Method.GetParameters()[0];

                var properties = parameterInfo.ParameterType.GetProperties();

                // zmena take v requestu
                // zmena skip v requestu

                getterValue = await task.Invoke(??????????????);

                skip += take;

            } while (!checker.Invoke(getterValue));

            return getterValue;
        }
    }

Volám to takhle:

Kód: [Vybrat]
        public async Task Run()
        {
            await PaginationHelper<string>.GetResultFromSearchAsync(
                async (r) => await SearchMethod(new SearchByNameRequest("Bill Clinton")),
                res => res != null,
                50);
        }

        public async Task<string> SearchMethod(SearchByNameRequest multipleRequest)
        {
            return "Bill Clinton";
        }

Tzn. v instanci toho delegátu už instance requestu je, jen nevím, v místě, kde jsou otazníky, jak ji dosadit.

3
Vývoj / C# a přístup k parametru delegáta
« kdy: 26. 04. 2019, 22:45:32 »
Dobrý den,

řeším následující problém : máme v API search metody, které mohou vracet x tuctů záznamů, proto máme requesty jako jejich parametry odvozeny od bázové třídy řekněme MultipleRequest, která obsahuje jako property index prvního záznamu následujícím po x-tém záznamu: jakési take + skip.

Protože mám za úkol najít nějaký konkrétní záznam splňující něco a protože takových metod máme x na entou, mám snahu napsat si helper.

Něco takového:

Kód: [Vybrat]
public class PaginationHelper<TR>
{
   public delegate Task<TR> SearchMethodDelegate(MultipleRequest request);

   public static async Task<TR> GetResultFromSearchAsync(SearchMethodDelegate task, Func<TR,bool> checker, int paging = 50)
   {
      ...
      var result = await task.Invoke(new MultipleRequest(take, skip)); // !!!!!!!!!
      ...
   }
}

Take a Skip vypočítávám v cyklu, ve kterém je i Invoke.

Problém mám s tím, že nechci volat Invoke s bázovou třídou MultipleRequest, ale s potomkem.

Ale jak se prosím k tomu potomkovi dostat?

4
Odpověď se nakonec našla:

1. Pokud se to volá z View, stačí zavolat Begin na Storyboard.

2. Pokud z View Modelu, tak na ThreadPoolu zavolat Dispatcher.BeginInvoke...

Snad to pomůže ostatním.

Jappa :-)

5
Ahoj,

potřeboval bych prosím docela pomoct, protože už jsem vyčerpal všechny své pokusy/omyly, co mě napadly.

Kvůli animaci jsem si odvodil z TextBlocku vlastní CustomTextBlock, není na něm nic moc zvláštního, ale vypadá takhle:

Kód: [Vybrat]
    public class CustomTextBlock : TextBlock
    {
        public static readonly RoutedEvent ShowTextEvent =
            EventManager.RegisterRoutedEvent("ShowText", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CustomTextBlock));

        public event RoutedEventHandler ShowText
        {
            add
            {
                this.AddHandler(ShowTextEvent, value);
            }

            remove
            {
                this.RemoveHandler(ShowTextEvent, value);
            }
        }
    }

v XAMLu mám potom:

Kód: [Vybrat]
        <local:CustomTextBlock x:Name="InfoTextBlock" Text="{Binding InfoTextBlockText, Mode=TwoWay}" Width="411" Height="54" FontSize="36" FontWeight="Normal" Canvas.Left="258" Canvas.Top="265">
            <local:CustomTextBlock.Foreground>
                <SolidColorBrush x:Name="InfoSolidColorBrush" Color="Transparent" />
            </local:CustomTextBlock.Foreground>
            <local:CustomTextBlock.Triggers>
                <EventTrigger RoutedEvent="local:CustomTextBlock.ShowText">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetName="InfoSolidColorBrush" Storyboard.TargetProperty="Color" From="GreenYellow" To="Transparent" Duration="0:0:3"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </local:CustomTextBlock.Triggers>
        </local:CustomTextBlock>

Je tam trigger, protože tu animaci potřebují zavolat z kódu, ovšem z View na základě co mi na převolání ViewModel vrátí.

A volám to takto:

Kód: [Vybrat]
InfoTextBlock.RaiseEvent(new RoutedEventArgs(CustomTextBlock.ShowTextEvent, this));

Je mi jasné, že když přeteče zásobník, musím tam mít někde cyklickou závislost, jenže ji nevídím.

Proto jsem chtěl poprosit, jestli by se na to někdo z vás mohl podívat svýma očima, třeba je to něco triviálního.

Byl bych vám za to moc vděčný.
Díky za případnou radu.

6
Vývoj / Reflexe u Tasku v C#
« kdy: 14. 03. 2019, 19:51:34 »
Zravíčko,

mám problém. Snažím se v metodě, které předám delegát typu task, přistoupit k parametrům metody, kterou ten task reprezentuje a nevím, jak na to, ani jestli to vůbec jde. Radši ukážu kód.

Kód: [Vybrat]
public class Program
    {
        public async Task<int> ReuseNumber(int a)
        {
            return a;
        }

        public async Task<int> ChangeTaskParams(Func<Task<int>> method)
        {

            // WHAT DO I WRONG ?
            Console.WriteLine(method.Method.GetParameters().GetValue(0));

            return await method.Invoke();
        }

        public void Run()
        {
            ChangeTaskParams(async () => await ReuseNumber(1)).GetAwaiter().GetResult();
        }

        public static void Main(string[] args)
        {
            new Program().Run();

            Console.ReadLine();
        }
    }

Dokázali byste mi prosím někdo poradit?

7
Kdepak, problém bude jinde a Play je asynchronní.
Raději to postnu celé, protože výtah byl matoucí:

Kód: [Vybrat]
using System;
using System.Linq;
using System.Windows.Media;
using System.Threading;
using System.Collections.Generic;
using JukeBox.Models;

namespace JukeBox.Helpers
{
    public class BackgroundPlayer
    {
        private static List<SongModel> queue = new List<SongModel>();

        public static SongModel _currentSong;

        private bool threadStarted = false;
        private Thread workerThread = new Thread(new ThreadStart(ThreadMethod));

        private static MediaPlayer mediaPlayer;

        private static AutoResetEvent autoResetEvent = new AutoResetEvent(false);

        public int RandomTime { get; set; } = 1;
        public Action<string> SongFinished;
        public Action RandomTimeReached;

        public BackgroundPlayer()
        {
            workerThread.IsBackground = true;
        }

        public void EnqueueSong(SongModel songModel)
        {
            queue.Add(songModel);

            if (!threadStarted)
            {
                threadStarted = true;

                workerThread.Start();
            }
        }

        public static void ThreadMethod()
        {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;

            while (true)
            {
                if (queue.Count > 0)
                {
                    var _currentSong = queue.First();

                    mediaPlayer.Open(new Uri(_currentSong.SongFullPath));
                   

                    mediaPlayer.Play();

                    autoResetEvent.WaitOne();
                }

                Thread.Sleep(1000);
            }
        }

        private static void MediaPlayer_MediaEnded(object sender, EventArgs e)
        {
            queue.Remove(_currentSong);

            autoResetEvent.Set();

            //Dispatcher.CurrentDispatcher.Invoke(new Action<string>((s) => SongFinished(_currentSong.SongName)));
        }
    }
}


Díky za jakýkoliv nápad.

8
Dobrý den, snažím se vytvořit JukeBox a jelikož se mi nedařilo zachytit eventu MediaEnded po dohrátí písničky, vytáhnul jsem kód do konzolové aplikace, kde se to snad bude ladit líp. Kód je:

Kód: [Vybrat]
using System;
using System.Windows.Media;

namespace MediaPlayerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().Run();

            Console.ReadLine();
        }

        public void Run()
        {
            var player = new MediaPlayer();
            player.MediaEnded += MediaPlayer_MediaEnded;

            player.Open(new Uri(@"d:\Jukebox\mp3\ROTTROVA MARIE - Reka lasky (CZ 2003)\03 ROTTROVA MARIE - Reka lasky.mp3"));
            player.Play();
        }

        private void MediaPlayer_MediaEnded(object sender, EventArgs e)
        {
            var x = 1;
        }
    }
}

Píseň se přehraje až do konce, ale eventa se neraisne.

Napadá někoho z vás pls čím by to mohlo být? V eventě mám breakpoint.

Díky

Stran: [1]

reklama