我创建了一个启动计时器的按钮,计时器的间隔为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;
}
答案 0 :(得分:2)
在计时器事件中使用this->textBox->Text = "njmk"
时,主线程应更新文本框文本;但是你要让主线程处于睡眠状态,因此不能自由更新文本框!!
请记住,UI对象是从主线程更新的!
这就是我们使用多线程的原因,如果我们必须运行长程序并让我们的窗口重新绘制并响应用户。
答案 1 :(得分:0)
它没有工作,因为你让线程(UI线程)睡眠1000 * 1000毫秒(~16分钟):
void button1_Click(...)
{
this->timer->Start();
for( int i = 0; i < 1000; i++ )
Thread::Sleep(1000);
this->timer->Stop();
}
这就是为什么它无法更新文本框内容。