листать по кадрам с использованием таймера кадров в секунду

#c#

#c#

Вопрос:

Ниже приведен код, который я создал в попытке создать временную шкалу, управляемую кнопкой воспроизведения / остановки. Я использую таймер из панели инструментов для увеличения времени по мере продвижения по временной шкале с использованием framesPerSecond. Я чувствую, что таймер, похоже, немного не точен. Мне было интересно, есть ли какие-либо предлагаемые улучшения для более точного управления временем? Я новичок в c #, так что потерпите меня в кодировании. Если это поможет, этот код предназначен для более крупного проекта, который я хочу создать, и это будет элементом управления временной шкалой, которая в конечном итоге будет меняться изображениями, как слайд-шоу. Спасибо

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace timelineControls
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            timer1.Tick  = new EventHandler(timer_Tick); // Every time timer ticks, timer_Tick will be called
        }

        private void cbPlayStop_CheckedChanged(object sender, EventArgs e)
        {
            Flipbook();
        }

        private void numFps_ValueChanged(object sender, EventArgs e)
        {
            Flipbook();
        }

        public void Flipbook()
        {
            bool result = cbPlayStop.Checked;
            if (result)
            {
                cbPlayStop.BackColor = System.Drawing.Color.Red;
                cbPlayStop.Text = "Stop";

                // increment the counter at a speed of (X) per second
                float framerate = (float)1.0 / (float)numFps.Value;

                // Timer will tick every 1 seconds (1000 milliseconds)
                timer1.Interval = (int)((float)1000 * framerate);
                timer1.Enabled = true; // pauses/unpauses
                timer1.Start();
            }
            else
            {
                cbPlayStop.BackColor = System.Drawing.Color.Green;
                cbPlayStop.Text = "Play";

                // stop timer from counting
                timer1.Stop();
            }
        }

        private int curTime = 0;

        void timer_Tick(object sender, EventArgs e)
        {
            //MessageBox.Show("Tick");                    // Alert the user
            int hours = DateTime.Now.Hour;
            int minutes = DateTime.Now.Minute;
            int seconds = DateTime.Now.Second;
            int milSeconds = DateTime.Now.Millisecond;

            string timeString = hours   " : "   minutes   " : "   seconds   " : "   milSeconds;


            bool loopEnabled = cbLoop.Checked;
            curTime  = 1;
            if (loopEnabled)
            {
                if (curTime > pBarTime.Maximum)
                {
                    curTime = pBarTime.Minimum;
                }
            }
            else
            {
                if (curTime > pBarTime.Maximum)
                {
                    timer1.Stop();
                    curTime = pBarTime.Maximum;
                }
            }


            pBarTime.Value = curTime;
            label2.Text = timeString;
            lbCurTime.Text = curTime.ToString();
        }
    }
}
  

Комментарии:

1. В чем конкретно заключается ваш вопрос здесь?

2. «Кадров в секунду» чего?

3. Таймер не очень хорошо подходит для точного определения времени, тем более для таких небольших промежутков времени. Но чтобы указать вам на правильное решение, нам нужно больше информации о том, что вы пытаетесь сделать.

4. хорошо. я перефразирую это и добавлю больше кода к вопросу.

Ответ №1:

Вы добавляете новое событие Tick каждый раз при вызове FlipBook , так что да, оно выполняется несколько раз.

Переместите это объявление в конструктор:

 public Form1()
{
  InitializeComponent();
  timer.Tick  = new EventHandler(timer_Tick);
}
  

Что касается возможностей таймера, смотрите Класс таймера MSDN

Компонент таймера Windows Forms является однопоточным и ограничен точностью 55 миллисекунд. Если вам требуется многопоточный таймер с большей точностью, используйте класс Timer в системе.Пространство имен таймеров.

Комментарии:

1. вы упоминаете использование этого класса Timer в системе. Пространство имен Timers ‘ Я не совсем уверен, как это реализовать. Знаете ли вы какие-нибудь хорошие руководства или примеры?

2. @JokerMartini Смотрите Сравнение классов таймеров в библиотеке классов .NET Framework .

3. Я предпринял попытку обновить приведенный выше код, чтобы создать более точный многопоточный счетчик. Я продолжаю получать странную ошибку, когда пытаюсь увеличить свою переменную curTime. не уверен, почему он это делает. Хотелось бы знать ваши мысли.

4. @JokerMartini Вы продолжаете добавлять обработчики событий в неправильном месте. Кажется, вы пропустили первую часть моего ответа.

5. В руководстве, которому я следовал, говорилось поместить его в кнопку. итак, я сделал, как сказано.