wxWidgets 多執行緒

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
shihyente
In need of some credit
In need of some credit
Posts: 3
Joined: Thu Sep 03, 2009 6:34 pm

wxWidgets 多執行緒

Post by shihyente »

●程式目的:

抓webCam的影像(讀進來是pixels array),顯示在wxWidgets視窗上

●遇到的困難:

我用多執行緒,可以抓影像,UI按鈕也不會沒反應,但是CPU使用率的%數好像不正常

在VS2008中沒問題,直接開執行檔後按x關閉,會有錯誤訊息

An unhandled win32 exception occurred in ...

網路上說是X按鈕的問題,但是我也找不出來 XD

(如果把多執行緒和影像的部分都拿掉,就不會,可見是他們的問題吧)

●程式環境:
Visual Studio 2008 (IDE)
Windows XP sp3
processor 1.70 GHz
594 MHz, 1.00 GB 的 RAM

前天弄到凌晨還是弄不出來

後來睡飽之後醒來覺得還是很不甘心

想說遲早要面對設計UI這個問題 後面的進度只好再熬夜來補了

廢話不多說...後來就上網再查文件,

結果現在很可以動了,但是CPU衝到 60% 左右,

未開程式之前 3%~5%

拿掉影像部分 10% 以下

功能全開後 Idle Process 40%~50% System 30% 程式本身 10幾 %

請問這樣正常嗎?因為我和我學長都很納悶 XD

我是這樣做

先在主frame建一個執行緒指標(無關的地方用...省略)

class RoboFrm : public wxFrame {
public:
...................
myThread *thread;
...................
};

然後建構函式中new

RoboFrm::RoboFrm(const wxString& title, ......

thread = new myThread(this);
if(thread->Create() != wxTHREAD_NO_ERROR)
wxLogError(wxT("Cannot create thread!"));
}

程式進入點宣告...

bool RoboApp::OnInit() {

RoboFrm *frame = ....

frame->Show(true);
frame->thread->Run();

return true;
}

然後我的執行緒類別這樣寫

class myThread : public wxThread {
public:
myThread(wxWindow *frame);
virtual void *Entry();
Camera *eye;
// Camera 是我用來讀webcam的類別
};

myThread::myThread(wxWindow *frame) : wxThread() {
eye = new Camera(frame, wxPoint(0,0),wxSize(IMG_W,IMG_H));
}

void *myThread::Entry() {
while(true && !TestDestroy()) {
if(eye->VI.isFrameNew(0)) {
// 上面是檢查 videoInput 中 frame 是不是新的
// 就算不檢查,情形也一樣
// 0 是我編號0的攝影機
// ps. videoInput 是網路上的library
//http://muonics.net/school/spring05/videoInput/

//wxMutexGuiEnter();
eye->DrawEye();
//wxMutexGuiLeave();
// 上面註釋掉是看範例有,但是我加上去就會當機
// 不懂為什麼
}
wxThread::Sleep(35);
// 因為我webcam 30fps
}
return NULL;
}

然後 Camera部分的函式我是這樣寫

class Camera : public wxPanel {.....

void Camera::OnPaint(wxPaintEvent& event) {

wxBufferedPaintDC dc(this);
Draw(dc);
}

void Camera::Draw(wxDC& dc) {

VI.getPixels(0, image.GetData(), true);
// 他會把讀進來的影像陣列放到image.GetData()的記憶體位置
// 0 是我編號0的攝影機

bmp = wxBitmap(image,-1);
dc.DrawBitmap(bmp, 0, 0, true);
}

bool Camera::DrawEye() {

Refresh(true);
Update();
return true;
}

如果把 Refresh(true) 拿掉會錯,拿掉 Update() 似乎沒影響?

最後在 VC 2008 中debug都沒問題

執行執行檔就會跳出錯誤訊息 XD (說有例外被丟出的樣子)

可是我真不知道又哪裡寫錯了

不曉得能不能請大家幫我看看

已經試好久了

真的不想放棄....第一次寫wxWidgets就遇到這麼大麻煩 T___T

程式碼&執行檔:(對不起檔案很大,我也真不知道為什麼這麼大 XDDDDD)

http://myweb.ncku.edu.tw/~f4494121/RoboLove2009.zip

感謝!!!希望有好心人能幫我看一下

PS..我是不是因為多執行緒釋放的方式錯了才會有錯誤訊息呢

void RoboFrm::OnQuit(wxCommandEvent& event) {

thread->Delete();
Close();
}
Post Reply