C# простой секундомер - тотальный новичок - PullRequest
0 голосов
/ 01 апреля 2020

Я пришел из встроенного C программирования и совершенно ничего не знаю о oop, задачах, потоках, e cc .. Я выясняю основные понятия C# и oop и хотел попробовать кодировать простой секундомер.

Цель: переключить состояние секундомера с помощью кнопки и показать значение внутри самой кнопки.

Пока я пришел к этому:

namespace Cronometro
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }
    }

    public class MyTimerClass
    {
        private DateTime TimeValue;
        private System.Timers.Timer TimerObj;
        private const int TimeInterval = 1;

        public MyTimerClass()
        {
            TimeValue new DateTime(0, 0, 0, 0, 0, 0, 0, DateTimeKind.Local);
            TimerObj = new System.Timers.Timer(TimeInterval);
            TimerObj.AutoReset = true;

            TimerObj.Elapsed += TimerObj_Elapsed;
        }

        private void TimerObj_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            TimeValue = TimeValue.AddMilliseconds((double)TimeInterval);
        }

        public void Start()
        {
            TimerObj.Start();
        }
        public void Stop()
        {
            TimerObj.Stop();
        }
    }
}

Итак, я просто хотел напечатать значение с помощью Button.Content, но мне кажется, что я не могу использовать его вне класса MainWindow.

Что мне делать? Я начал думать о создании задачи внутри основного класса и подождал, пока событие таймера выведет значение, но ничего не знаю о потоках и задачах.

Ответы [ 3 ]

0 голосов
/ 01 апреля 2020

Во-первых, вам не нужно писать свой собственный класс секундомера. Do tNet имеет свои собственные значения: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch?view=netframework-4.8

Во-вторых, попытайтесь понять схему асинхронного ожидания: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

Итак, Вы можете сделать что-то вроде этого: https://wouterdekort.com/2013/10/01/async-and-await-and-the-ui-thread/

0 голосов
/ 02 апреля 2020

Одним из способов заполнения текста кнопки является создание события в классе MyTimerClass и присоединение к нему делегата слушателя из класса MainWindow.

Затем запустите событие в TimerObj_Elapsed в MyTimerClass, чтобы вызвать обработчик события в MainWindow, и у вас будет возможность заполнить кнопку.

Тем не менее, есть нечто иное, чем «практика занятий», с которой вам приходится иметь дело. Поскольку вы используете таймер пула потоков, обработчик события Elapsed таймера вызывается из рабочего потока. В приложении GUI только основной поток / пользовательский интерфейс может взаимодействовать с элементами управления. Таким образом, скорее всего, вы получите исключение при попытке установить Button.Text. Вам нужно будет упорядочить действие set в потоке пользовательского интерфейса.

Честно говоря, если вы практикуете написание классов в C#, я бы порекомендовал вам использовать консольное приложение для начала, а не GUI приложение. Вероятно, не очень хорошая идея, если люди выбрасывают на стол слишком много понятий, которые вы не знаете одновременно.

0 голосов
/ 01 апреля 2020

Непонятно, что именно вы имеете в виду, поскольку в данный момент вы вообще не можете использовать его в классе MainWindow. Просто предоставьте значение через функцию publi c, и вы сможете получить значение экземпляра в любом месте.

namespace Cronometro
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var x = new MyTimerClass();       // <<<
            x.Start();                        // <<<
            var timeValue = x.GetTimeValue(); // <<<
        }
    }

public class MyTimerClass
{
    private DateTime TimeValue;
    private System.Timers.Timer TimerObj;
    private const int TimeInterval = 1;

    public MyTimerClass()
    {
        TimeValue new DateTime(0, 0, 0, 0, 0, 0, 0, DateTimeKind.Local);
        TimerObj = new System.Timers.Timer(TimeInterval);
        TimerObj.AutoReset = true;

        TimerObj.Elapsed += TimerObj_Elapsed;
    }

    private void TimerObj_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        TimeValue = TimeValue.AddMilliseconds((double)TimeInterval);
    }

    public DateTime GetTimeValue() // <<<
    {                              // <<<
        return TimeValue;          // <<<
    }                              // <<<

    public void Start()
    {
        TimerObj.Start();
    }
    public void Stop()
    {
        TimerObj.Stop();
    }
}
...