比如CToolDlg主窗体类,定义了UINT CToolDlg::RetrieveAndAnalyzeData(LPVOID pParam)来读取数据,UINT CToolDlg::ControlProgressBar(LPVOID pParam)来控制进度条如果用UINT ToolThread(LPVOID pParam)来读取数据--全局函数,用void CToolDlg::OnTimer(UINT nIDEvent) 来控制进度条好像也可以.请问如果为UINT CToolDlg::ToolThread(LPVOID pParam)是否不能用void CToolDlg::OnTimer(UINT nIDEvent) 来控制进度条?....很是不懂,各位请指点.谢谢

解决方案 »

  1.   

    MFC的界面窗口是线程相关的,你不可以在工作线程里直接对界面进行直接的操作,应该通过发送自定义消息的方式来实现。
      

  2.   

    我本来的理解是:工作者线程可以被窗体线程调用但是反则不行.而且MFC窗体就是一个窗体线程,但是:CToolDlg主窗体类,定义了UINT CToolDlg::RetrieveAndAnalyzeData(LPVOID pParam)来读取数据,UINT CToolDlg::ControlProgressBar(LPVOID pParam)来控制进度条 ---这个为什么可以执行?
    一般"AfxBeginThread(ReadBackFATDataThread,this);"中报错为"error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'"又是什么原因呢?谢谢
      

  3.   

    检查一下线程函数定义ReadBackFATDataThread
      

  4.   

    函数类型不对
    你看看你的函数定义跟AfxBeginThread要求的一样吗
      

  5.   

    工作线程最好不要直接操作MFC对象等,因为它们对于多线程处理支持不好,所以,才会要求工作线程发送消息给UI线程,然后通知它来更新进度等!
      

  6.   

    在线程中PostMessage给主窗口,由窗口操作界面,不要在线程操作界面
      

  7.   

    恩,谢谢楼上几位.那我现在还是采取工作者线程为全局函数,和DLG无关,两者之间的通信靠全局变量和POSTMES来实现.用void CToolDlg::OnTimer(UINT nIDEvent) 来控制进度条.
    这样是否比较妥善?
      

  8.   

    线程可以用全局函数,也可以用类的静态函数,把类指针作为参数传给线程,通过该指针类访问类成员。线程中可以直接设置进度条。用SetTimer的方式不够准确。
      

  9.   

    之前我用过窗体线程中使用OnTimer(),同步新建的工作者线程.
    现在不知为何不同步了,,,请各位帮忙...有什么需要注意的吗?
      

  10.   

    可以把CToolDlg的对象指针作为参数(lParam)传给线程,假设进度条控件ID为IDC_PROGRESS1,线程中可以
    CToolDlg* dlg = (CToolDlg*)lParam;
    CProgressCtrl* ctrl = (CProgressCtrl*)dlg->GetDlgItem(IDC_PROGRESS1);
    ctrl->SetPos(xxx);
    MFC类中对控件控制的函数内部通过SendMessage来实现的,所以可以在线程中使用。