本人小菜鸟级别,做了个mfc的测试软件
将每台设备的信息、测试操作等封装到一个类里,然后将创建的设备对象插入到一个list容器里,界面点按钮就会访问容器,然后依次去调用对象里的测试函数。测试函数里是起了一个线程。请问,怎样将测试结果反馈到界面上~拜托各位了~~~
email:[email protected]
mfc多线程数据显示

解决方案 »

  1.   

    做一个dialog
    用updatedata(true);
    更新
      

  2.   

    将你的类对象指针当参数传进线程,比如
    CTestDialog *dlg = .....;
    DWORD dwThreadID = 0;
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadTest,dlg ,0,&dwThreadID);DWORD ThreadTest(LPVOID wParam)
    {
      CTestDialog *pDlg = (CTestDialog *)wParam;
      if(pDlg != NULL)
      {
         while(...)
        {
             .....
        }
        pDlg->PostMessage(.....);线程中通过发送消息给界面进行更新,不要直接更新界面,  否则是不安全调用.
      }
      return 0;
    }
      

  3.   

    线程中给主对话框发送消息,PostMessage,窗口句柄作为参数等传递到测试函数线程等
      

  4.   

    如果在主界面里调用另一个界面,我会这么用,但是我的流程是:在主界面上点击按钮->调用另一个文件的类里的多线程->将这些线程得到的结果显示到主界面上。这样就不会了。
      

  5.   

    以前写的一个线程与窗口互相通信的小程序,希望对你有用哟:
    http://blog.csdn.net/hjx_1000/article/details/8476092
      

  6.   

    当前窗口的就是:m_hWnd
    直接用就行了,它是窗口类自带的成员变量
      

  7.   

    ::PostMessage函数的后两个参数就是用于存放向目标窗口发送的数据
      

  8.   

    我想将 “hello world”发过去,请问该怎么实现啊,帮我写下吧。
    PostMessage这个里面的参数,好像没有能直接放字符串的。
      

  9.   

    char* pBuf = new char(256);
    sprintf(pBuf,"%s","hello world");
    ::PostMessage(pData->m_hDebugerWnd,MSG_RES_DEBUG_THREAD,(WPARAM)0,(LPARAM)pBuf);
      

  10.   


    //发送消息代码。这里还没进到线程里,先在起线程的上一级,测试了下。
    VOID CDevOper::Get(HWND m_hMainWnd,int flag){
    char* pBuf = new char(256);
    sprintf(pBuf,"%s","hello world");
    PostMessageA( m_hMainWnd,ID_MSG_STATE,0,(LPARAM)pBuf);
    return;
    }
    //接收代码
    LRESULT CMibWalkDlg::onState( WPARAM w, LPARAM a)
    {
    m_mStaticState.SetWindowTextA((LPCTSTR)a );
    UpdateData( FALSE );
    return 0;
    }
    //与函数绑定部分的代码。
    ON_MESSAGE( ID_MSG_STATE, onState )这样是不是哪又错了,还是得不到结果。
      

  11.   

    //发送消息代码。这里还没进到线程里,先在起线程的上一级,测试了下。
    VOID CDevOper::Get(HWND m_hMainWnd,int flag){
        char szBuf[64]={0};
        sprintf(szBuf,"%s","hello world");
        SendMessageA( m_hMainWnd,ID_MSG_STATE,0,(LPARAM)szBuf);
        return;
    }
    //接收代码
    LRESULT CMibWalkDlg::onState( WPARAM w, LPARAM a)
    {
        m_mStaticState.SetWindowTextA((LPCTSTR)a );
        return 0;
    }
      

  12.   

    1、你先单步执行一下,在函数onState里打个断点看程序是否进入该函数。
    2、你的工程是使用的多字节的,而pbuf是char类型的指针,你将char* 修改为WCHAR*
      

  13.   

    我试了下,把在同一个类里发送信息,是可以发送到界面控件里的。但是在CDevOper类里发送,调试发现onState没有接受到消息。
      

  14.   

    我试了下,把在同一个类里发送信息,是可以发送到界面控件里的。但是在CDevOper类里发送,调试发现onState没有接受到消息。
      

  15.   

    如24楼所说,在函数onState里看下句柄的值是否正确。
      

  16.   

    确实是句柄传的不对,非常感谢~~~
    不过还有个问题哈。
    需要发的消息都是 CString 类型的。请问怎么在 PostMessageA 这里使用啊。
      

  17.   

    使用GetBuffer()将CString转换为char* ;
    例如:char* filename = csFileName.GetBuffer();