因为在采集图像的函数中包含一个死循环,我做的一个示例的流程是:
当点击采集按钮时,在其事件响应中新建一个线程1,在线程1中调用彩集图像的函数,这样,图像就可以一直采集了。
在回调函数中,创建线程2,在线程2中进行图像显示的操作(用到一些全局变量),然后join,这样可以保证只有在图像处理完后,才能采集一下帧图像。
如果不新建线程2,而在回高函数里直接进行图像显示操作,对话框界面会显示成空白,就是什么都没有,但按照上面的作法,就不会出现这种情况。
但现在的问题是,图像没有显示出来,是哪里的原因呢?下面的我的代码,其中ShowFun是线程2中调用的函数,ShowBmp是线程1中调用的函数,即回调函数。
Code: Select all
void soDlgDialog::ShowBmp(IMGBUF* pImgFr,void* pvd)
{
//s_mutexProtectingTheGlobalData->Lock();
// if(pImg == NULL)
// pImg = pImgFr;
// else
// pDlg->Refresh();
//s_mutexProtectingTheGlobalData->Unlock();
pthread_t p2;
int res2;
res2 = pthread_create(&p2,NULL,ShowFun,(void*)pImgFr);
if(res2 != 0)
{
wxMessageBox(wxT("pthread_create error!"));
return;
}
pthread_join(p2,NULL);
}
void *ShowFun(void *arg)
{
IMGBUF* pImgFr = (IMGBUF*)arg;
BITMAPFILEHEADER bHead;
CLEAR(bHead);
bHead.bfType = 0x4D42;
bHead.bfSize = pImgFr->lBufferSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bHead.bfReserved1 = 0;
bHead.bfReserved2 = 0;
bHead.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
// FILE* f = fopen("./bmp1.bmp","wb+");
// fwrite(&bHead,sizeof(BITMAPFILEHEADER),1,f);
// fwrite(&(pImgFr->bih),sizeof(pImgFr->bih),1,f);
// fwrite(pImgFr->pBuffer,pImgFr->lBufferSize,1,f);
// fclose(f);
char * bufB = (char*)malloc(bHead.bfSize);
if(bufB == NULL)
wxMessageBox(wxT("malloc error!"));
memcpy(bufB,&bHead,sizeof(bHead));
memcpy(bufB+sizeof(bHead),&(pImgFr->bih),sizeof(pImgFr->bih));
memcpy(bufB+bHead.bfOffBits,pImgFr->pBuffer,pImgFr->lBufferSize);
// FILE* f = fopen("./bmp2.bmp","wb+");
// fwrite(bufB,bHead.bfSize,1,f);
// fclose(f);
wxBitmap bmpTmp(bufB,pImgFr->bih.biWidth,pImgFr->bih.biHeight,24);
//wxBitmap bmpTmp(wxT("./bmp2.bmp"));
//int r = bmpTmp.SaveFile(wxT("./test111.bmp"),wxBITMAP_TYPE_BMP);
//soDlgDialog::bmp1->Clean();
soDlgDialog::bmp1->SetBitmap(bmpTmp);
// wxMemoryDC memDC;
// //wxBitmap bmpTmp(wxT("./bmp1.bmp"));
// //wxBitmap bmpTmp((const char*)pImgFr->pBuffer,pImgFr->bih.biWidth,pImgFr->bih.biHeight,24);
// //destDC.Clear();
// memDC.SelectObject(bmpTmp);
// wxClientDC destDC(soDlgDialog::bmp1);
// //Draw the bitmap at 100, 100 on the destination DC
// destDC.Blit(0, 0, // Draw at (100, 100)
// bmpTmp.GetWidth(),
// bmpTmp.GetHeight(), // Drawfullbitmap
// &memDC, // Draw from memDC
// 0, 0, // Draw from bitmap origin
// wxCOPY, // Logical operation
// false) ; // Take mask into account no
// memDC.SelectObject(wxNullBitmap);
// //Alternative method: use DrawBitmap
// destDC.DrawBitmap(bmpTmp, 0, 0, true);
//soDlgDialog::bmp1->SetBitmap(bmpTmp);
free(bufB);
//soDlgDialog::bmp1->Refresh();
//soDlgDialog::bmp1->Update();
//soDlgDialog::this->Refresh();
pthread_exit(NULL);
}