大家好,请教个问题:在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);
}

解决方案 »

  1.   

    在view上的OnToolBarPrintSequeue函数直接保存成bmp是没有问题的                         --------------------------写错了OnToolBarPrintSequeue这个函数是开线程的那个函数
      

  2.   

    你说在不开线程的时候试过,在view上的OnToolBarPrintSequeue函数直接保存成bmp是没有问题的。
    由此猜测你的线程有问题,你可以调到这里去看看位图的数据 HBITMAP hBitmap = (HBITMAP)(*(node->bitmap));
    另外你的结构体,一般开线程传的都是指针,你却是传一个结构体对象,只怕效率会有很大问题。你用了一个结构体去定义那么多字符串,为什么不用一个容器或CStringArray去管理呢?这也是效率的问题。用CreateThread来写多线程最大的问题就是要确保同步的问题,不像封装了CreateThread的BeginThread那么简单。所以这又涉及到多线程的很多问题。
      

  3.   

    线程参数必须是32bit,如何不是整数或字符,就只能是指针了。