MFC在阻塞运行的函数中实现动态刷新界面,解决界面假死的问题

⌚Time: 2022-12-23 17:13:36

👨‍💻Author: Jack Ge

在一些密集计算的函数中,需要耗费大量的时间,并且是阻塞方式运行,这时候界面就会卡死


while(true){

    //其它代码

    ...

    //刷新界面显示的语句

    ((CEdit*)GetDlgItem(IDC_EDIT1))->SetWindowText(tempStr);

}

执行过程并不会动态的刷新界面显示,而是执行完成后显示最后一次的刷新效果

解决办法:

可以使用线程来异步运行该函数,如果不想使用线程,可以

定义一个函数DoEvents()


bool DoEvents()

{

    MSG msg;

    while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

    {

        if (msg.message == WM_QUIT)

        {

            return false;

        }

        if (!AfxGetApp()->PreTranslateMessage(&msg))

        {

            ::TranslateMessage(&msg);

            ::DispatchMessage(&msg);

        }

    }

    return true;

}

在密集计算的代码中调用该方法


while(true){

    //其它代码

    ...

    //刷新界面的语句

    ((CEdit*)GetDlgItem(IDC_EDIT1))->SetWindowText(tempStr);

    //调用DoEvents

    DoEvents();

}

这样就可以在每次while循环中进行一次界面刷新,实时显示运行的状态