#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. В руководстве, которому я следовал, говорилось поместить его в кнопку. итак, я сделал, как сказано.