做了个程序,单击按钮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);    //这个刷新要怎样才能知道子线程已经处理完了,才执行

解决方案 »

  1.   

    你可以把主线程的对话框的句柄或窗口指针传递到子线程的执行函数(RunAlgorithm)中,
    当图片处理完成后,用传递进来的指针去调用重绘的代码。
      

  2.   

    你让子线程完成任务后发个消息给主线程不就可以了。主线程收到消息就重绘。
    GDI好像不是线程安全的,如果在子线程里调用重绘代码会有问题。
      

  3.   

    很简单,创建线程时把窗口句柄传给子线程,当你的子线程要退出时(算法执行结束时)发个消息给主窗口,让它执行刷新(重绘)就可以了。HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, (LPVOID)m_hWnd, 0, NULL);// 这边把窗口句柄m_hWnd传给子线程
    CloseHandle(hThread);
    子线程结束时调用::PostMessage(hWnd, WM_PAIN...
      

  4.   

    是这样传吗?HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, &m_hWnd, 0, NULL);然后在RunAlgorithm里加如下代码:HWND* hWnd = (HWND*)lpParameter;
    hWnd->InvalidateRect(NULL);
    这样出错了,不知道错哪里???
      

  5.   

    //创建线程
    HANDLE hThread = CreateThread(NULL, 0, RunAlgorithm, (LPVOID)m_hWnd, 0, NULL);// 将窗口句柄传给子线程
    //暂停运行
    CloseHandle(hThread);
    子线程结束前(算法结束时)发消息给主窗口,让主窗口重绘
    HWND hWnd = (HWND)lpParameter;// 子线程的第一句,把传进来的窗口句柄参数保存下
    ::PostMessage(hWnd, WM_PAIN,....  // 发消息重绘
      

  6.   

    你也可以定义一个结构体(内含一个bool 值)作为线程函数的参数 主线程加个定时器,判断BOOL值当为TRUE时 条用ONPAINT
      

  7.   

    自定义消息,子线程执行完成后  发消息给窗口更新!
    也可以用WaitForSingleObject等待线程句柄
      

  8.   

    UI界面线程中创建工作线程的时候将UI窗口的HWND窗口句柄传递进入
    AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());
    在线程函数中如果计算完成就可以利用该HWND窗口句柄发送自定义的消息。UI线程中去接收和处理该自定义的消息