У меня есть несколько проблем с кодом ниже.Таймеры в C# с глобальными переменными?
Когда приложение запускается, как только LookingAwayResult.Text = "Yes"
, запускается таймер и рассчитывает до 10. Когда LookingAwayResult.Text = "No"
или "Maybe"
, таймер должен остановиться и сбросить обратно в 0 раз, но это не так.
Когда таймер достигает 10, появляется окно с сообщением, которое я хочу, но это продолжит показ и спам моего экрана. Таймер предназначен для возврата обратно в 0 после появления окна сообщения, и приложение замерзает, пока в поле сообщения не будет выбрано «Ok».
Кажется, что мой код зацикливает весь таймер, который не то, что я хочу.
private void OnFaceFrameArrived(object sender, FaceFrameArrivedEventArgs e)
{
// Retrieve the face reference
FaceFrameReference faceRef = e.FrameReference;
if (faceRef == null) return;
// Acquire the face frame
using (FaceFrame faceFrame = faceRef.AcquireFrame())
{
if (faceFrame == null) return;
// Retrieve the face frame result
FaceFrameResult frameResult = faceFrame.FaceFrameResult;
// Display the values
HappyResult.Text = frameResult.FaceProperties[FaceProperty.Happy].ToString();
EngagedResult.Text = frameResult.FaceProperties[FaceProperty.Engaged].ToString();
GlassesResult.Text = frameResult.FaceProperties[FaceProperty.WearingGlasses].ToString();
LeftEyeResult.Text = frameResult.FaceProperties[FaceProperty.LeftEyeClosed].ToString();
RightEyeResult.Text = frameResult.FaceProperties[FaceProperty.RightEyeClosed].ToString();
MouthOpenResult.Text = frameResult.FaceProperties[FaceProperty.MouthOpen].ToString();
MouthMovedResult.Text = frameResult.FaceProperties[FaceProperty.MouthMoved].ToString();
//initilize look away timer for 10 seconds
Timer lookAwayTimer = new Timer(interval: 10000);
//inialize the poll tiomer for 50 ms
Timer pollTimer = new Timer(interval: 50);
LookingAwayResult.Text = frameResult.FaceProperties[FaceProperty.LookingAway].ToString();
//if 10 seconds expires then show message box
lookAwayTimer.Elapsed += (s, f) =>
{
MessageBox.Show("Looking is set to yes", "Looking Error", MessageBoxButton.OK);
};
//enable poll timer
pollTimer.Enabled = true;
//check if person is looking. If they are not then enable the lookAwayTimer. If they start looking
//then disable the timer
pollTimer.Elapsed += (s, f) =>
{
Check = frameResult.FaceProperties[FaceProperty.LookingAway].ToString();
if (Check == "Yes")
{
lookAwayTimer.Enabled = true;
}
else
{
lookAwayTimer.Enabled = false;
}
};
}
}
То, что я после того, как для таймер будет работать после того, как человек не смотрит и останавливается и сбрасывается обратно в 0, когда человек снова смотрит.
Когда таймер достиг 10 секунд, появляется окно сообщения, и приложение замерзает. Пользователь должен выбрать «Ok», чтобы этот флажок исчез, и приложение вернется к значениям по умолчанию.
Из исследования, я полагаю, возможно, использование глобальной переменной или модальной коробки пригодится здесь?
Я считаю, что с помощью модального блока это заморозит мое приложение, пока пользователь ничего не сделает с ним? Но это все еще не решает моих проблем с таймером, не возвращаясь обратно к 0 и желая, чтобы приложение полностью сбросилось после выбора «ОК».
Я также подчеркиваю, что глобальные переменные в C# следует избегать, если это необходимо.
Если модальная коробка является ответом для части этого, я бы просто изменил MessageBox.Show
на ShowDialog
?
Как я могу реализовать этот код, чтобы делать то, что мне нужно, с таймерами? Что мне нужно изменить? – lfctez
Просто создайте объект вышеуказанного класса и вызовите метод show класса в прошедшем событии вместо MessageBox.Show() –