主线程与子线程间通信

huasonl88 2012-03-22 01:15:30
做了个程序,单击按钮1打开一张图片并在窗口中显示,再单击按钮2后创建个子线程(子线程主要是执行一个算法处理图

片),最后把处理好的图片在窗口中重绘。但是并没有得到我要的结果,图片没有任何的改变,貌似是因为子线程还没有执行

完窗口就已经重绘了,现在的问题是我该怎么让主线程等待子线程(即算法)运行完后再重绘的问题???

在这先排除用sleep方法暂停主线程,因为这会影响代码的效率,还有就是图片的大小不一样的话子线程运行的时间也不确

定……

不知道有没有一种通信的手段,让按钮2创建子线程后去获取子线程运行完的消息然后接着运行下面的代码刷新窗口,如果有

的话,给个思路……在这先谢过了!或者利用线程同步的方法也可以,求个思路………

按钮2的代码:
m_pBuf = m_pdataContol->BitMap2Bits();
//创建线程
HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, NULL, 0, NULL);
//暂停运行
//Sleep(10);
CloseHandle(hThread);

m_pdataContol->UnLockBits();
EnterCriticalSection(&g_cs);
InvalidateRect(NULL); //这个刷新要怎样才能知道子线程已经处理完了,才执行





...全文
361 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2012-04-01
  • 打赏
  • 举报
回复
在子线程完成之后,直接让显示区域无效。
Eleven 2012-04-01
  • 打赏
  • 举报
回复
UI界面线程中创建工作线程的时候将UI窗口的HWND窗口句柄传递进入
AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());
在线程函数中如果计算完成就可以利用该HWND窗口句柄发送自定义的消息。UI线程中去接收和处理该自定义的消息
泥鳅不是鱼 2012-04-01
  • 打赏
  • 举报
回复
自定义消息,子线程执行完成后 发消息给窗口更新!
也可以用WaitForSingleObject等待线程句柄
lusedeya6 2012-03-27
  • 打赏
  • 举报
回复
你也可以定义一个结构体(内含一个bool 值)作为线程函数的参数 主线程加个定时器,判断BOOL值当为TRUE时 条用ONPAINT
donglinshengan 2012-03-22
  • 打赏
  • 举报
回复
//创建线程
HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, (LPVOID)m_hWnd, 0, NULL);// 将窗口句柄传给子线程
//暂停运行
CloseHandle(hThread);


子线程结束前(算法结束时)发消息给主窗口,让主窗口重绘
HWND hWnd = (HWND)lpParameter;// 子线程的第一句,把传进来的窗口句柄参数保存下
::PostMessage(hWnd, WM_PAIN,.... // 发消息重绘
huasonl88 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 foundersg 的回复:]
你让子线程完成任务后发个消息给主线程不就可以了。主线程收到消息就重绘。
GDI好像不是线程安全的,如果在子线程里调用重绘代码会有问题。
[/Quote]


这个消息该怎么写呢?不知道该怎么写啊??能贴下代码吗?
huasonl88 2012-03-22
  • 打赏
  • 举报
回复
是这样传吗?

HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, &m_hWnd, 0, NULL);

然后在RunAlgorithm里加如下代码:

HWND* hWnd = (HWND*)lpParameter;
hWnd->InvalidateRect(NULL);


这样出错了,不知道错哪里???

FounderSG 2012-03-22
  • 打赏
  • 举报
回复
你让子线程完成任务后发个消息给主线程不就可以了。主线程收到消息就重绘。
GDI好像不是线程安全的,如果在子线程里调用重绘代码会有问题。
donglinshengan 2012-03-22
  • 打赏
  • 举报
回复
很简单,创建线程时把窗口句柄传给子线程,当你的子线程要退出时(算法执行结束时)发个消息给主窗口,让它执行刷新(重绘)就可以了。

HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, (LPVOID)m_hWnd, 0, NULL);// 这边把窗口句柄m_hWnd传给子线程
CloseHandle(hThread);


子线程结束时调用::PostMessage(hWnd, WM_PAIN...
LittleCommit 2012-03-22
  • 打赏
  • 举报
回复
你可以把主线程的对话框的句柄或窗口指针传递到子线程的执行函数(RunAlgorithm)中,
当图片处理完成后,用传递进来的指针去调用重绘的代码。

15,471

社区成员

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

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