.net c ++ timer_tick函数不起作用

时间:2011-12-02 12:45:08

标签: .net timer managed-c++

我创建了一个启动计时器的按钮,计时器的间隔为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 个答案:

答案 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();
}

这就是为什么它无法更新文本框内容。