.net c ++ функция timer_tick не работает - PullRequest
1 голос
/ 02 декабря 2011

Я создал кнопку для запуска таймера, и интервал таймера равен 1000. Я добавил обработчик события timer_Tick (), но он не работает, я не понимаю причину.

Вот мой код:

void button1_Click(...)
{
    this->timer->Start();
    for( int i = 0; i < 1000; i++ )
        Thread::Sleep(1000);
    this->timer->Stop();
}

void timer_Tick(...)
{
    this->textBox->Text = "njmk"; // only to handle while debugging but it is not handled
}

Примечание: я добавил это:

this->timer->Tick += gcnew System::EventHandler(this, &Form1::timer_Tick);

РЕДАКТИРОВАТЬ:

ОК, я постараюсь объяснить свою проблему ясно.У меня есть основная форма, и в строке состояния у меня есть toolstripprogressbar.
Когда я нажимаю кнопку, функция начинает анализ файла, и индикатор выполнения должен отображать ход выполнения функции.Так вот мой код:

void button_click(...)
{
    this->progressBar->Visible = true;
    this->backGroundWorker->RunWorkerAsync();
}

void backGorundWorker_DoWork(...)
{
    this->timer->Start();
    ParseFunction(); // it takes about two minute
    this->timer->Stop();
}

void timer_Tick(...)
{
    this->bacGroundWorker->ReportProgress(5);
}

void backGroundWorker_ProgressChanged(...)
{
    this->progressBar->Value += e->ProgressPercentage();
}
void backGroundWorker_RunWorkerComplete(...)
{
    this->progressBar->Visible = false;
}

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Когда вы используете this->textBox->Text = "njmk" в событии таймера, основной поток должен обновить текстовое поле; но вы заставляете основной поток спать, поэтому обновление текстового поля не бесплатное !!
Помните, что объекты пользовательского интерфейса обновляются из основного потока!
По этой причине мы используем многопоточность, если нам нужно запустить длинные процедуры и позволить нашему окну перерисовываться и отвечать пользователю.

0 голосов
/ 02 декабря 2011

Это не работает, потому что вы переводите поток (поток пользовательского интерфейса) в спящий режим на 1000 * 1000 миллисекунд (~ 16 минут):

void button1_Click(...)
{
    this->timer->Start();
    for( int i = 0; i < 1000; i++ )
        Thread::Sleep(1000);
    this->timer->Stop();
}

Именно поэтому он не может обновить содержимое текстового поля.

...