回1楼,是子线程在进行文件拷贝动作,主线程调用CDlgPwdEnter dlg;dlg.DoModal();来显示对话框,是同步执行的。

解决方案 »

  1.   

    我的代码里,有如下2行代码:
    CDlgPwdEnter dlg;
    dlg.DoModal();
    在一般情况下,我的执行完第一句后,对话框都会立即显示。你确定你说的是”我的执行完第句后,对话框都会立即显示“,而不是执行了dlg.DoModal()后才显示的?看看你拷贝文件时的CPU占用率
      

  2.   

    回3楼,我说错了,一般是执行完DoModal后会立即显示,但是当有其它线程在拷贝文件时,执行完DoModal后,对话框显示就会延迟不少。此时CPU和内存占用率都很低。我调试进去,在系统的RunModalLoop函数里面,花费了大量时间。
      

  3.   

    重载RunModalLoop函数,在里面打印日志,显示从函数进入到ShowWindow,中间的时间间隔多达30秒。中间有好多其他的消息,大部份消息是定时器消息和message号为 0x0d 的消息,0x0d我不知道是什么消息。
      

  4.   

    #define WM_SETTEXT                      0x000C  
    #define WM_GETTEXT                      0x000D  
    #define WM_GETTEXTLENGTH      0x000E  
      

  5.   

    有人知道是什么原因么?对话框DoModal后,就一直在RunModalLoop里面循环好久才会运行到ShowWindow(SW_SHOWNORMAL);,导致对话框一直无法显示出来
      

  6.   

    这就是传说中的CPU调度的问题吧,创建的线程越多,CUP调度就越复杂,且牵扯到线程优先级,有些时候某些线程抢占cpu的几率就比较小
      

  7.   

    散分了,在RunModalLoop打印日志,显示有个定时器在会调用GetWindowText,把定时器的这段句删除掉就正常了,现在还不知道其它地方对这里是否还有影响。