我创建了一个对话框程序,在对话框中放入了一个Progress control,然后我想在一个工作者线程中控制该对话框进度的增长,可是工作者线程是一个全局函数,怎样才能得到该控件变量呢

解决方案 »

  1.   

    首先要说的就是:
    线程中不能访问GDI的GDI对象,那样有异常,那那么你必须通过其他办法来做
    然后在创建THREAD的时候,你将DLG的handle传递给线程作为参数
    使用SendMessage或者postmessage给DLG,让DLG自己来更新
      

  2.   

    直接将progress control的HWND传递给线程
      

  3.   

    使用SendMessage或者postmessage给DLG,让DLG自己来更新
    这样比较好
      

  4.   

    获得HANDLE后呢?怎样得到指针?用FromHandle()返回的指针并不总是可用
      

  5.   

    不能在工作线程中使用FromHandle
    方法是
    CWnd::Deatch->向工作线程传递HWND->在工作线程调用CWnd::Attach.
      

  6.   

    http://support.microsoft.com/default.aspx?scid=kb;en-us;147578
    http://support.microsoft.com/default.aspx?scid=kb;en-us;175668
      

  7.   

    可以将progress 窗口指针传入 线程函数 或者使用回掉函数.
      

  8.   

    回掉函数指针同样需要传入线程函数.
    一般这样实现的
    dialog 中有一个public 函数 设置进度public dialog::setpos(int)全局变量
    dialog* gpdlg;全局回掉函数
    void callbackfunc(int pos)
    {
       if (gpdlg) {
         gpdlg->setpos(pos);
       }
    }启动线程需要的工作
    dialog::beginthread()
    {
      gpdlg = this;
      //启动线程 并传入 callbackfunc 函数地址
    }//线程函数
    typedef void(*call_func)(int);
    void thread(LPVOID param)
    {
       call_func pfunc =(call_func)param;
       //下面是伪代码,还需要注意线程间同步
       //while() {
       //  pfunc(进度);
       //}}
      

  9.   

    线程函数应该返回 UINT, 要改一下. 启动线程 
    可以这样
     beginthread(thread ,(void*)callbackfunc) 具体参考 afxbeginthread 或者 _beginthread 的说明
    关键是把 callbackfunc 转为 (void*) 就可以了.