在这个基于对话框的应用程序中,GUI会在几秒钟后冻结
GUI freezes after a few seconds in this dialog based application
我是一个初学者,试图理解GUI在几秒钟后冻结的原因。试着运行它,看看我的意思。。难道它不应该永远打印Hello1 Hello2 Hello3 Hello4和Hello5吗?需要明确的是:是SetWindowText()停止了工作,所以是GUI冻结了。我的意思是,应用程序一直在运行,只是"显示文本"部分崩溃了。我知道这一点是因为我在发布之前对它进行了调试。那么我错过了什么?为什么天气很冷?你知道吗?提前感谢
这是main.cpp:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "resource.h"
using namespace std;
HINSTANCE hInst;
void sayHello(HWND handle)
{
BOOL working = true;
while (working)
{
SetWindowText(handle, "Hello1");
SetWindowText(handle, "Hello2");
SetWindowText(handle, "Hello3");
SetWindowText(handle, "Hello4");
SetWindowText(handle, "Hello5");
}
}
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
return TRUE;
case WM_CLOSE:
EndDialog(hwndDlg, 0);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BTN_QUIT:
EndDialog(hwndDlg, 0);
return TRUE;
case IDC_BTN_TEST:
HWND handle = GetDlgItem(hwndDlg, 1003);
sayHello(handle);
return TRUE;
}
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
hInst = hInstance;
return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
}
这是资源。h:
#include <windows.h>
#define DLG_MAIN 101
#define IDC_BTN_TEST 1001
#define IDC_BTN_QUIT 1002
#define ID_CONTROLSTATIC 1003
这里是resource.rc:
#include "resource.h"
DLG_MAIN DIALOGEX 6, 5, 194, 106
CAPTION "Test Application"
BEGIN
CONTROL "&Test", IDC_BTN_TEST, "Button", 0x10010000, 138, 5, 46, 15
CONTROL "TEXT HERE", ID_CONTROLSTATIC, "Static", 0x10010000, 35, 35, 50, 8
CONTROL "&Quit", IDC_BTN_QUIT, "Button", 0x10010000, 138, 29, 46, 15
END
这里有一个无限的looop:
void sayHello(HWND handle)
{
BOOL working = true;
while (working)
{
SetWindowText(handle, "Hello1");
SetWindowText(handle, "Hello2");
SetWindowText(handle, "Hello3");
SetWindowText(handle, "Hello4");
SetWindowText(handle, "Hello5");
}
}
添加退出循环的条件,例如if(something) working = false;
如果你想让它永远打印,你至少需要在命令之间添加一个计时器,因为它打印消息的速度太快了,你不会真正知道它正在发生。
所有windows GUI程序的基本结构都是一个消息循环,类似于:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
程序在GetMessage
调用中等待,直到消息到达,然后处理消息(最终在窗口或对话框过程中结束),然后返回GetMessage
等待下一条消息。
在您的程序中,消息循环隐藏在对DialogBox
的调用中,但它就在那里。
当您单击IDC_BUTTON_TEST
时,函数sayHello
永远不会返回。因此,控制永远不会返回到消息循环,因此您不再处理任何消息,并且您的程序似乎已挂起。
如果你想与消息循环并行工作,你至少有两个选择:
- 创建一个计时器。当您收到
WM_TIMER
消息时,您需要做一些工作(如显示列表中的下一个字符串),然后返回消息循环并等待更多消息。你在每个计时器上做的工作越多,你的应用程序的响应就越差 - 创建另一个线程。这可以在不干扰消息循环的情况下连续运行,但可能会更复杂,因为您必须担心线程之间的同步
相关文章:
- 在C++中,如何通过几种类型从元组中选择多个元素
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 自一周开始以来的秒数?
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- Gstreamer:每 5 秒使用多文件墨水保存图像/jpeg
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 通过字符串来计算长度需要更长的时间,而不是移动字符串几次?
- C++每 x 秒调用一次函数
- Win32 发送输入鼠标移动滞后并冻结
- ImGui 在单击按钮后冻结
- 每秒清除一次终端,但留下几分钟
- WinAPI BitBlt冻结几分钟
- 将几秒钟转换为几天,小时,分钟,秒格式(C )
- 将年龄在几年,小时,几分钟和秒的时间内转换
- 点击几下后Winapi菜单冻结
- 为什么OpenCV程序捕捉视频帧会在几秒钟后冻结
- 在这个基于对话框的应用程序中,GUI会在几秒钟后冻结
- 如何在当前时间的打印输出中获得更高的精度(几分之一秒)
- 让一个boost线程休眠几纳秒
- 如何以几秒间隔多次使用 QTcpSocket 实例