线程传参数问题
大家好,请教个问题:
在sdi上的一段代码,我自己开了个线程,这个线程的作用是把内存DC中的数据变成bmp保存下来。
void CImgCreateThread::Create(CDC &MemDC,CBitmap &bitmap,HWND &hwnd,int PrintNum)
{
static ThreadNode node;
node.MemDC = &MemDC;
node.bitmap = &bitmap;
node.hwnd = &hwnd;
node.PrintNum = PrintNum;
hThread = CreateThread(NULL,0,CreateImg,&node,0,NULL);
CloseHandle(hThread);
}
ThreadNode 是我自己定义的一个结构体 如下:
typedef struct _ThreadNode
{
CDC *MemDC;
CBitmap *bitmap;
HWND *hwnd;
int PrintNum;
}ThreadNode,*pThreadNode;
以下是线程函数:
DWORD WINAPI CreateImg(LPVOID lpParameter)
{
pThreadNode node;
node = (pThreadNode)lpParameter;
....
HBITMAP hBitmap = (HBITMAP)(*(node->bitmap));
int ret = GetObject(hBitmap, sizeof(BITMAP), &Bitmap)
。。。。
}
ret那里返回值却是0 (不成功)
这是怎么怎么回事呢?
我自己在不开线程的时候试过,在view上的OnToolBarPrintSequeue函数直接保存成bmp是没有问题的,但是当我开线程去写的时候就出现如上的如题了。
以下是OnToolBarPrintSequeue函数,有点长。。。
void CShowView::OnToolBarPrintSequeue()
{
CStrongDoc* pDoc = (CStrongDoc*)GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CRect rect(0,0,2592,900); // 显示区大小
CDC *pDC = GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
CBitmap* pOldBitmap = MemDC.SelectObject(&MemBitmap);
CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush = MemDC.SelectObject(pBrush);
MemDC.FillSolidRect(&rect,RGB(255,255,255));//背景颜色,白色
/************************************************************************/
/* 画已经创建的图形 m_ArrayObjCreated */
/************************************************************************/
DrawCreatedObjs(MemDC);
if (IDOK == dlgprint.DoModal())
{
int printNum = dlgprint.iIndex + 1; //下标重0开始的
typedef struct _MsgNode
{
CString str_f;
CString str_m;
CString str_b;
CString str_type;
CString i_num;
}MsgNode;
m_CurOperate = UNDEFINE_VALUE;
//auto_ptr<CImgCreateThread> imgThread;
CImgCreateThread *pImgThread = new CImgCreateThread;
pImgThread->Create(MemDC,MemBitmap,this->m_hWnd,printNum);
delete pImgThread;
}
MemDC.SelectObject(pOldBrush);
pBrush->DeleteObject();
MemDC.SelectObject(pOldBitmap);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(pDC);
}