带有线程的多个对话框中的进度条

时间:2013-06-10 22:01:04

标签: c++ multithreading oop winapi mfc

我的应用程序必须跟踪时间并在不同阶段提醒用户允许或不允许某些操作。因为用户将等待,我想显示进度以显示等待时间。例如,我的设备在启动之前必须等待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 passed\r\n");

            // 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;
}

1 个答案:

答案 0 :(得分: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 ++程序员也有好处);)