[英]Progress bar in multiple dialogs with thread
我的应用程序必须跟踪时间并在不同阶段提醒用户,以允许或不允许某些操作。 因为用户将等待,所以我想显示进度以显示等待时间。 例如,我的设备在启动后必须等待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;
}
我不确定我是否是“ 如果您只有锤子,一切看起来都像钉子 ”综合症的受害者,但是您可以使用与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函数,但是可以传递MyTwoWindows的实例来代替单个HWND 。
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 ++程序员也有帮助)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.