书上说,在工作线程里不要做跟界面有关的东西,但我老师不明白,怎么样的行为称得上是和界面有关假如,一个工作线程用于进行数据传输,那么如果需要传输的数据时需要从控件中读取,那么这个从控件读取数据的动作,算不算是和界面有关?

解决方案 »

  1.   

    所谓在工作线程里不要做跟界面有关的东西,好像是说不要在工作线程里更新界面,如Enable...、
    Set...之类
      

  2.   


    UINT ThreadStart(LPVOID p)
    {
    CButton *thisdlg = (CButton*)p;
    thisdlg->SetWindowText(_T("aaaaaaa"));
    return 0;
    }
    void CtestDlg::OnBnClickedButton1()
    {
    AfxBeginThread(ThreadStart,(void*)&m_btn2);
    }
    还有,这段代码执行的时候为什么没有出现卡死的情况呢
      

  3.   


    读取你肯定想读取到当前最新的吧,你如果用控件关联变量,是不是要UpdateData下,更新的过程中就是对界面数据的一次读操作
      

  4.   

    但问题是,为什么有的操作,如在线程中更新进度条,就可以正常工作。例如下面的代码UINT CSendFileDlg::SendFileThread( LPVOID lparam )
    {
    CSendFileDlg *pthisDlg = (CSendFileDlg*)lparam; FILEINFO FileInfo;
            // A
    int loopcounter =  pthisDlg->m_SendFile_List.GetItemCount();
    SOCKET SocketRecv = pthisDlg->m_SendSocket;
    CFile tmp_ReadFile;
            
    for (int i = 0 ; i < loopcounter ; i++) //B
    {
      wcscpy_s(FileInfo.FileName ,pthisDlg->m_SendFile_List.GetItemText(i , 1));
      tmp_ReadFile.Open(pthisDlg->m_SendFile_List.GetItemText(i , 3) , CFile::modeRead|CFile::shareDenyNone);
      FileInfo.FileSize = tmp_ReadFile.GetLength();
      FileInfo.RestFileCount = loopcounter-i-1; send(SocketRecv ,(char*)&FileInfo , sizeof(FileInfo),0);
    tmp_ReadFile.Close();
    }        // 从listctrl中读取文件路径,并发送文件
             // ......
    }
    当有B处的循环代码时,直接在loopcounter =  pthisDlg->m_SendFile_List.GetItemCount();处卡死而没有B处时则一切正常,即便之后又从listCtrl中读取数据、更新进度条也都能正常进行
    这是何故,
      

  5.   

    你b处是干什么用的?不是从list中读取文件路径,并发送文件的??
      

  6.   


    就是从list中读取文件路径,然后读取文件并发送
      

  7.   

    看不懂你9楼的问题
    ...而没有B处时则一切正常,即便之后又从listCtrl中读取数据、更新进度条也都能正常进行..你b处就是从list中读取文件路径,然后读取文件并发送,你又说而没有B处时则一切正常..即便之后又从listCtrl中读取数据、更新进度条也都能正常进行..
      

  8.   


    哦,抱歉,说错了,B处的代码只是发送文件的信息(文件名和大小),并等待接收方的回应。而B处之后的代码才是发送文件,即从list中读取文件路径.....