Отображение обратного отсчета в многопоточном приложении C # WIndows Forms - PullRequest
0 голосов
/ 21 октября 2019

Я пробовал несколько решений с таймерами (пробовал все три класса таймеров), и ни одно из них не запускало событие Tick (истекшее) в этом конкретном месте. У меня есть многопоточное приложение WinForms. То, что мне нужно, кажется простым, но я потратил несколько дней на это и готов бросить полотенце.

Мне нужно отображать текущий отсчет во всплывающем окне, пока выполняется действие. Если прошло 90 секунд, а результаты не достигнуты (у меня есть флаг), выведите предупреждение, поэтому мне нужно точно обновить поток пользовательского интерфейса.

Я рассмотрел три различных класса таймеров, и ни один из них не работает для меня в этомконкретное место - их прошедшие или отмеченные события не запускаются. Я думаю, это потому, что у меня уже есть другой поток, который опрашивает последовательный порт, потому что, если я создаю фиктивную кнопку и привязываю таймер к событию Click, это нормально. Обратите внимание, что мне не нужен таймер для запуска внутри опроса последовательного порта, функциональность полностью отдельная.

Может кто-нибудь предложить какое-либо решение, которое может работать в этом случае?

Классы, которые я пробовал:

 Windows.Forms.Timer
    System.Timers.Timer
    System.Threading.Timer

1 Ответ

0 голосов
/ 22 октября 2019

В этом ответе предполагается, что «всплывающее окно» не будет блокировать основной поток пользовательского интерфейса.

Создайте новую дочернюю форму MIDI для вашего «всплывающего окна», если вы хотите, чтобы она существовала в пределах родительской формы, в противном случае это работаетотлично.

Код взят из очень полезного ответа Алекса: Как использовать BackgroundWorker?

public Popup()
{
    InitializeComponent();

    backgroundWorker1.DoWork += backgroundWorker1_DoWork;
    backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
    backgroundWorker1.WorkerReportsProgress = true;
}

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(1000);
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    if(progressBar1.Value == 90) 
        WarningLbl.Text = "WARNING: Process is taking too long to complete.";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...