做了个程序,单击按钮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); //这个刷新要怎样才能知道子线程已经处理完了,才执行
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); //这个刷新要怎样才能知道子线程已经处理完了,才执行
当图片处理完成后,用传递进来的指针去调用重绘的代码。
GDI好像不是线程安全的,如果在子线程里调用重绘代码会有问题。
CloseHandle(hThread);
子线程结束时调用::PostMessage(hWnd, WM_PAIN...
hWnd->InvalidateRect(NULL);
这样出错了,不知道错哪里???
HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, (LPVOID)m_hWnd, 0, NULL);// 将窗口句柄传给子线程
//暂停运行
CloseHandle(hThread);
子线程结束前(算法结束时)发消息给主窗口,让主窗口重绘
HWND hWnd = (HWND)lpParameter;// 子线程的第一句,把传进来的窗口句柄参数保存下
::PostMessage(hWnd, WM_PAIN,.... // 发消息重绘
也可以用WaitForSingleObject等待线程句柄
AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());
在线程函数中如果计算完成就可以利用该HWND窗口句柄发送自定义的消息。UI线程中去接收和处理该自定义的消息