2011-12-02 35 views
1

我创建了一个按钮来启动计时器和计时器的间隔是1000.我添加了一个timer_Tick()事件处理程序,但它不工作,我不明白原因。.net C++ 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); 

编辑:

OK,我会尽量解释清楚我的问题。 我有一个主窗体,并在状态栏中我有一个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

你不需要计时器来更新进度条:你需要在你的'ParseFunction()'里面做。注意:在调试中,您可能会遇到一些错误,因为您尝试从另一个线程更新为UI对象。如果直接运行EXE,则不会引发此错误;在调试过程中使用'if ... InvokeRequired ...'来解决它。 – Marco

回答

0

它不工作,因为你正在做的线程(UI线程)睡了1000 * 1000毫秒(〜16分钟):

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

这就是为什么它不能更新文本框的内容。

+0

看上去我已经回答了;但是,是的,你是对的,这就是问题 – Marco

+0

好吧,你是对的。所以,如何在功能运行时获得时间。我的意思是,我调用一个函数,并假设它需要1分钟,我想每10秒执行一次另一个函数。我怎样才能做到这一点? – user983924

+1

@ user983924目前尚不清楚你在做什么。请重新说明,然后将其添加到您的问题中。 – Nasreddine

2

当您在计时器事件中使用this->textBox->Text = "njmk",主线程应该更新文本框的文本;但是你正在让主线程进入睡眠状态,所以它不能自由更新文本框!
请记住,UI对象从主线程更新!
这是我们使用多线程的原因,如果我们必须运行长程序并让我们的窗口重新绘制并响应用户。