我做了一个对话框程序,在响应按钮事件时(按钮事件里的程序执行时间较长),界面上的其他控件就无法使用了,而且事件中对其他控件属性的改变(如文本框内的文本)也要到线程结束时才显现。如何才能实现按钮事件响应时,其他控件的访问和其他控件属性的实时改变?是不是一定要用多线程?不用能实现吗?

解决方案 »

  1.   

    VC++ MFC 多线程及线程同步
    http://blog.sina.com.cn/s/blog_4fd8460f01009aay.html
      

  2.   

    if (IDOK == dlg.DoModal())
    {
        ...
    }
    ...表示在dlg对话框按了OK按钮之后才继续执行下面的语句,即此时界面上不能进行其他操作,被阻塞。
    可以直接使用dlg.DoModal();即不等待该对话框的操作结果,马上执行下面的操作。
      

  3.   

    http://www.vckbase.com里搜一下多线程,有好多例子的,
    祝你成功!
      

  4.   

    不要阻塞消息循环,如果需要更新界面,只需在代码中加入消息循环代码即可。
    m_edit.SetWindowText("abcd"); // 加入下面的消息循环代码,EDIT设置的文本就能更新
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
      DispatchMessage(&msg);
      

  5.   

    多线程示例:UINT myThread(LPVOID lpParam)
    {
       ......
       
       return 0;
    }//假设你的响应按钮事件函数为CMyDialog::OnClickBtn()
    void CMyDialog::OnClickBtn()
    {
         ....
     
         AfxBeginThread(myThread, NULL);
    }afxBeginThread函数的第二个参数就是传递给myThread函数的值,上面的例子相当于myThread(NULL),你可以根据具体情况传递需要的参数。
    具体可参考 MSDN 中关于 afxBeginThread函数的用法。
      

  6.   

    hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc, 
                             pParam, dwFlags, &idThread) ; 
    第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指标。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。第二个参数是用於新执行绪的初始堆叠大小,预设值为0。在任何情况下,Windows根据需要动态延长堆叠的大小。 CreateThread的第三个参数是指向执行绪函式的指标。函式名称没有限制,但是必须以下列形式宣告: DWORD WINAPI ThreadProc (PVOID pParam) ; 
    CreateThread的第四个参数为传递给ThreadProc的参数。这样主执行绪和从属执行绪就可以共用资料。 CreateThread的第五个参数通常为0,但当建立的执行绪不马上执行时为旗标CREATE_SUSPENDED。执行绪将暂停直到呼叫ResumeThread来恢复执行绪的执行为止。第六个参数是一个指标,指向接受执行绪ID值的变数。UINT ThreadProc(LPVOID lpParam) 

      //do something
      
      return 0;