2011-12-02 82 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對象從主線程更新!
這是我們使用多線程的原因,如果我們必須運行長程序並讓我們的窗口重新繪製並響應用戶。