You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RunFactoryTest中ListView无法实时显示测试结果的技术求助

问题根源

你的代码里RunFactoryTest是在UI线程执行的,循环中的测试函数会持续阻塞UI线程——ListView的更新消息会被积压,直到所有测试完成后,UI线程才会处理这些刷新请求,所以看不到实时更新效果。

两种可行解决方案

方案一:强制UI线程实时处理消息(适合短耗时测试)

在每次更新ListView后,加入消息循环处理当前积压的UI消息,让界面立即刷新。同时要注意正确初始化LVITEM的必要成员(之前的代码可能遗漏了行索引等关键参数):

typedef bool (*CbFactoryTestFunction)();

void RunFactoryTest(){
    CbFactoryTestFunction cbTestArray[MAXNUM] = {test1,test2,test3...};
    bool ret = false;
    LVITEM lvi;
    // 必须初始化mask和索引参数,否则LVM_SETITEM不会生效
    lvi.mask = LVIF_TEXT;
    
    for(int i = 0;i < MAXNUM;i++)
    {
        ret = cbTestArray[i]();
        
        lvi.iItem = i;          // 设置当前测试对应的行号
        lvi.iSubItem = 0;       // 设置要更新的列(示例为第一列)
        lvi.pszText = ret ? "OK" : "NG";
        
        SendMessage(hwndListView, LVM_SETITEM, 0, reinterpret_cast<LPARAM>(&lvi));
        
        // 处理积压的UI消息,强制界面刷新
        MSG msg;
        while(PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}

方案二:工作线程执行测试+UI线程单独更新(适合长耗时测试)

如果测试函数执行时间较长,阻塞UI线程会导致界面卡顿,更合理的做法是把测试逻辑放到独立工作线程,每完成一项测试就给UI线程发消息,由UI线程负责更新ListView:

1. 定义自定义消息

#define WM_UPDATE_TEST_RESULT (WM_USER + 100)

2. 工作线程函数(执行测试逻辑)

DWORD WINAPI TestThreadProc(LPVOID lpParam)
{
    HWND hwndList = reinterpret_cast<HWND>(lpParam);
    CbFactoryTestFunction cbTestArray[MAXNUM] = {test1,test2,test3...};
    
    for(int i = 0;i < MAXNUM;i++)
    {
        bool ret = cbTestArray[i]();
        // 打包测试索引和结果,通过消息传递给UI线程
        LPARAM lParam = MAKELONG(i, ret ? 1 : 0);
        PostMessage(hwndList, WM_UPDATE_TEST_RESULT, 0, lParam);
        
        // 可选:短暂休眠避免消息队列积压
        Sleep(10);
    }
    return 0;
}

3. 启动测试线程(比如在按钮点击事件中)

void StartFactoryTests()
{
    CreateThread(nullptr, 0, TestThreadProc, hwndListView, 0, nullptr);
}

4. UI窗口处理自定义消息(更新ListView)

在窗口消息处理函数中添加:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_UPDATE_TEST_RESULT:
            {
                int testIndex = LOWORD(lParam);
                bool testPass = HIWORD(lParam) != 0;
                
                LVITEM lvi = {0};
                lvi.mask = LVIF_TEXT;
                lvi.iItem = testIndex;
                lvi.iSubItem = 0;
                lvi.pszText = testPass ? "OK" : "NG";
                SendMessage(hwndListView, LVM_SETITEM, 0, reinterpret_cast<LPARAM>(&lvi));
            }
            return 0;
        // 其他消息处理逻辑...
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}
注意事项
  • 方案一实现简单,但如果测试耗时过长,UI仍会出现卡顿,适合轻量测试场景
  • 方案二更健壮,UI始终保持响应,适合大型测试场景
  • 两种方案都必须确保LVITEM的mask、iItem等核心参数正确初始化,否则ListView无法正确更新

内容的提问来源于stack exchange,提问作者renfeiyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:47:53