线程传参数问题

zjjhglem 2011-10-04 04:32:15
大家好,请教个问题:

在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);
}
...全文
107 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-10-04
  • 打赏
  • 举报
回复
你跟踪的线程里面看看指针指向的内容还正确么
hztj2005 2011-10-04
  • 打赏
  • 举报
回复
线程参数必须是32bit,如何不是整数或字符,就只能是指针了。
gibsonboy 2011-10-04
  • 打赏
  • 举报
回复
你说在不开线程的时候试过,在view上的OnToolBarPrintSequeue函数直接保存成bmp是没有问题的。
由此猜测你的线程有问题,你可以调到这里去看看位图的数据 HBITMAP hBitmap = (HBITMAP)(*(node->bitmap));
另外你的结构体,一般开线程传的都是指针,你却是传一个结构体对象,只怕效率会有很大问题。你用了一个结构体去定义那么多字符串,为什么不用一个容器或CStringArray去管理呢?这也是效率的问题。用CreateThread来写多线程最大的问题就是要确保同步的问题,不像封装了CreateThread的BeginThread那么简单。所以这又涉及到多线程的很多问题。
zjjhglem 2011-10-04
  • 打赏
  • 举报
回复
在view上的OnToolBarPrintSequeue函数直接保存成bmp是没有问题的

--------------------------写错了。。。

OnToolBarPrintSequeue这个函数是开线程的那个函数。。。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧