进度条在多个对话框与线程
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 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++程序员也很好);)
相关文章:
- 如何抓取指向Qt中弹出对话框的指针,该对话框阻止了QTest中的UI线程
- 如何在另一个线程中关闭 MFC 模式对话框并获取对话框返回值?
- 如何从另一个线程关闭对话框?QT
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 在std ::线程中打开MFC对话框
- 如何在对话框编辑框中显示来自 UI 线程类 Run() 函数的字符串
- 显示Q对话框时出现QT线程问题
- 关闭其他线程的对话框后无法从主窗口聚焦
- 关闭MFC对话框时多线程对象被破坏
- 线程退出时 DLL 中的 MFC 无模式对话框被销毁
- 在 MFC 对话框和自己的线程上的 OpenGL 控件之间传递消息
- 消息框线程问题
- 从线程 MFC 将返回值发送到对话框
- 工作线程使主线程MFC的对话框处于非活动状态
- 单击对话框关闭按钮时,正确中止线程
- 在c++中对来自其他正在运行的线程的消息对话框进行建模
- 如何创建消息框线程
- 进度条在多个对话框与线程
- MFC主UI线程工作和模态对话框
- 访问线程(MFC)中的主对话框变量