我也碰到过。可能是多次加载模块的原因。打开对话框需要很多提供支持的dll模块。

解决方案 »

  1.   

    我昨天这样做了,发现是组合框初始化耗时较多,就是组合框初始化的时候,需要用发送消息的方式一一向里面添加选项。但是电脑刚开机的时候,组合框初始化耗时也不多。我有一个子对话框里面有十几个组合框,每个初始化的时候需要向里面添加几十个选项。可是电脑刚开机的时候,这个子对话框只耗时0。1秒左右,再加上别的子对话框,总共约耗时0。4秒,就可以打开整设置对话框(包括建立各个子对话框)。但是随着打开“设置”对话框次数越来越多,慢慢的会变慢。打开次数越多,越慢。到了最后,我再调试,发现那个以前建立只需要0。1秒的子对话框,现在建立它需要耗时0。8秒左右。再加上别的子对话框建立的耗时也有延长,整个设置对话框的建立需要耗费2秒以上。就很慢了。可是这是怎么回事呢?那个子对话框只是建立一些组合框而已,我把代码贴出来:LRESULT CALLBACK DlgProc3(HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam)
    {
    switch (message)
    {
    case WM_NOTIFY:
    return TRUE;
    case WM_INITDIALOG:
    MoveWindow(hDlg, TREEWIDTH + SETSPACE * 2, SETSPACE, SETDLGWIDTH, SETDLGHIGH, TRUE);
    for(int i = IDC_COMBO1; i < IDC_COMBO10 + 1; i++)
    {
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"空格");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"回车");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"z");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"Shift");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"左Shift");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"右Shift");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"Tab");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"`");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)";");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"\'");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)",");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)".");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"/");
    SendMessage(GetDlgItem(hDlg, i), CB_ADDSTRING, 0, (LPARAM)"[");
    }
    SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_SELECTSTRING, 0, (LPARAM)asc2name(set.inputPy));
    SendMessage(GetDlgItem(hDlg, IDC_COMBO2), CB_SELECTSTRING, 0, (LPARAM)asc2name(set.inputEn));
    SendMessage(GetDlgItem(hDlg, IDC_COMBO3), CB_SELECTSTRING, 0, (LPARAM)asc2name(set.overEn));
    SendMessage(GetDlgItem(hDlg, IDC_COMBO4), CB_SELECTSTRING, 0, (LPARAM)asc2name(set.CreateCi));
    SendMessage(GetDlgItem(hDlg, IDC_COMBO5), CB_SELECTSTRING, 0, (LPARAM)asc2name(set.SelMask));
    for(int i=0; i<5; i++)
    {
    SendMessage(GetDlgItem(hDlg, IDC_COMBO6 + i), CB_SELECTSTRING, 0, (LPARAM)asc2name(set.Select[i]));
    }
    return TRUE;
    case WM_CLOSE:
    DestroyWindow(hDlg);
    return TRUE;
    default:
    ;
    }
    return FALSE;
    }
    这个对话框建立的时候变慢得最明显,可以看到,它只是建立一些组合框,并初始化它们,总共有十个组合框,每一个需要添加15个选项,总共也不过150个,可为什么建立会越来越慢?
      

  2.   

    上面是这个对话框的对话框过程。下面是建立它的语句:hDlg3 = CreateDialogParam(hIn, MAKEINTRESOURCE(IDD_DIALOG3), hDlg,(DLGPROC)DlgProc3, NULL);我刚才调试了一下,现在这条语句执行前后的时间差是0。25秒,比刚开机已经慢了,但比昨天最慢的时候的0。8秒要快很多。可是我知道,随着我打开次数变多,它会变得越来越慢。我真是感到奇怪,我建立这些组合框,然后退出对话框,资源不都释放了吗?从道理上讲不应该越来越慢。而且内存还有700多M,似乎也是够的。而且我还发现一个奇怪的现象:搜狗拼音的设置对话框,打开也需要一次的时间,但是它的时间似乎是恒定的,总需要一秒左右。当我自己的输入法的对话框打开已经比较慢的时候,再打开搜狗拼音的设置对话框,发现人家时间似乎还和刚开始一样。如果是我的输入法消耗了过多的资源,那应该也把搜狗拼音的设置对话框拖慢了才对。可是人家的速度不变。不管是刚开机还是我自己的设置对话框已经变慢了以后。
      

  3.   

    我记得 某程序 需要的 dll , 在该程序退出后 会 保留 15 分钟 , 以防 该程序 又打开. 
      

  4.   

    忽然发现一个现象:当对话框打开越来越慢以后,只要把VS2008关掉,马上迅速变快了,变得和刚开始一样快!是不是说:VS2008消耗了过多的资源?导致打开对话框变慢?那为什么刚开始的时候,也是打开VS2008的,为什么刚开始的时候就快呢?还是说VS2008在使用过程中,消耗了越来越多的资源?
      

  5.   

    关掉VS2008,打开对话框变快,然后再次打开VS2008,发现打开对话框的速度仍然是快的。说明VS2008在关掉以后,释放了很多资源?
      

  6.   

    楼主,不知道你有没有留意过VS2008输出框内容。你在调试的时候,每次打开对话框的时候VS2008输出框就会输出一些信息:
    加载****DLL,
    加载****DLL,
    等等,你的对话框作为主线程的东西来说的话,会出现你说的变慢的情况。但是你开辟一个次线程,这个线程来管理你的那个对话框,每次打开开启次线程,关闭的时候次线程结束,释放次线程所有资源。
    这样的话,你对话框打开时间基本稳定。