●程式目的:
抓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();
}