[C++] BackgroundWorker

  • 1689
  • 0
  • C++
  • 2011-09-20

摘要:[C++] BackgroundWorker

這陣子都在執行某單位的計畫,其中要求要做一套系統的設計,上次寫C++,已經是兩年前的事了,於是這次就當作是複習來寫這套系統。

系統需求為資料接收後、判定、儲存、回傳,很清楚我要用Socket還有SQLServer,大概知道這些後,畫出的資料流程如下:

很單純的資料對傳,但是卻因為我原本設想一次解決接收、判定、儲存、回傳,卻忽略了Socket還有SQLServer在做資料處理並不是即時就可以解決的,而是需要處理時間。

因此我得到了一個狀況:所有的程式邏輯看起來都正確,而且沒有Error或是Exception,但是Server在跑完一個run的時候卻停止了,導致Client沒辦法做更多次的傳送。原本想說是Socket或是DB的部分有瑕疵,但是怎麼檢查,所有的Code都正確,該有的沒有少。加入了MessageBox來抓程式都斷在哪行程式,但是得到的答案卻不同,因此讓我萌生了是不是BackgroundWorker在作怪...

後來,再加入了兩個BackgroundWorker做動作,至於執行緒的生命週期我就不多說了,所以後來系統的資料流程變成:

流程不變,但是卻變成有三個BackgroundWorker做控制,這樣就每個階段的任務都可以正確地做完,該儲存的會儲存,該回傳的會回傳。

但是在加入其他的BackgroundWorker的時候,我遇到一個問題了,BackgroundWorker怎麼傳值?後來看了MSDN後大概想了一下,大概知道怎麼寫,假設我們要將BackgroundWorker1的值傳給BackgroundWorker2,那麼程式的撰寫會如下:

private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
  String^ s;
  backgroundWorker2->RunWorkerAsync(s);
}

而在BackgroundWorker2的部分要這樣收值:

private: System::Void backgroundWorker2_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
  String^ s = (String^)e->Argument;
  s.......
}

這樣就可以把數據丟來丟去做工作囉~當時我還想到struct去勒= ="

Reference:

MSDN BackgroundWorker

Keyword:

BackgroundWorker pass by value, Multi-Thread