进度条在多个对话框与线程

Progress bar in multiple dialogs with thread

本文关键字:对话框 线程      更新时间:2023-10-16

我的应用程序必须跟踪时间,并在不同阶段提醒用户允许或不允许某些操作。因为用户将会等待,所以我想要显示一个进度来显示等待时间。例如,我的设备在启动时必须等待5分钟才能准备好使用。问题是用户可以导航到多个对话框,我想在其中两个对话框上显示进度条。我使用了一个线程来"运行时钟",当进度条需要更新或时间活动完成时,它会向GUI发送消息。

问题是,我可以传递初始窗口的句柄,可以从线程接收通知,但当用户去到另一个屏幕时会发生什么?另一个窗口甚至还不存在。还有其他的机制可以使用吗?我的目标是在两个对话框中重用时间检查代码。

下面是一个非常简单的代码:

UINT MonitorTimeThread(LPVOID pVoid )
{
    HWND hWnd = ( HWND ) pVoid;
    HANDLE timer = ::CreateWaitableTimer(NULL, FALSE, NULL);
    SYSTEMTIME t;
    ::GetSystemTime(&t);
    LARGE_INTEGER alarm;
    ::SystemTimeToFileTime(&t, (FILETIME *)&alarm);
    ::SetWaitableTimer(timer, &alarm, 5000, NULL, NULL, FALSE);
    bool done = false;
    while (!done )
    {
        if (WaitForSingleObject( timer, INFINITE ) == WAIT_OBJECT_0 )
        {
            TRACE("time inteval has passedrn");
            // update the progress bar on GUI
            PostThreadMessage(hWnd, UM_PROGRESS_TICK, 0 );
            // if user has switch to another window, how to direct messages to that?
        }
    }
    return 0;
}

我不确定我是否是"如果你只有一把锤子,一切看起来都像钉子"综合症的受害者,但你可以使用类似的解决方案https://stackoverflow.com/a/17033971/145757

class MyTwoWindows
{
    public: HWND window1;
    public: HWND window2;
    public: MyTwoWindows(HWND w1, HWND w2)
    {
        this->window1 = w1;
        this->window2 = w2;
    }
};

然后我不知道如何将数据传输到MonitorTimeThread函数,但不是单个HWND,您可以传递MyTwoWindows的实例。

UINT MonitorTimeThread(LPVOID pVoid )
{
    MyTwoWindows* data = (MyTwoWindows*) pVoid;
    ...
    PostThreadMessage(data->window1, UM_PROGRESS_TICK, 0 );
    PostThreadMessage(data->window2, UM_PROGRESS_TICK, 0 );

此外,如果两个窗口不是同时创建的,您仍然可以实时修改对象:

void CreateSecondWindow()
{
    HWND hwnd = // a new window;
    myTwoWindows->window2 = hwnd;
}

而在监控功能中:

if (data->window2 != NULL)
{
    PostThreadMessage(data->window2, UM_PROGRESS_TICK, 0 );
}

很抱歉,如果这是无关的,但它是晚了。:)

PS:我在这里写过这个综合症:http://pragmateek.com/if-all-you-have-is-a-hammer/(在c#中实现,但对c++程序员也很好);)