|
创建1个定时器用于新建子窗口的实时更新数据,但是大约30秒后,更新速度就会变慢,按键触摸反应也很慢,1~2秒更新一次数据,但是是定时器500mS更新1次数据,触摸点击反应迟钝。删除定时器后,按键反应是正常的。
这是哪里有问题呢?
void MainTask(void)
{
/* 初始化 */
GUI_Init();
/*
关于多缓冲和窗口内存设备的设置说明
1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
WM_MULTIBUF_Enable(1);
2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
4. 所有emWin例子默认是开启三缓冲。
*/
WM_MULTIBUF_Enable(1); /* 开启STemWin多缓冲,RGB屏可能会用到 */
WM_SetCreateFlags(WM_CF_MEMDEV); /* 启动所有窗口的存储设备 */
GUI_SetBkColor(GUI_WHITE); /* 设置当前背景色 */
GUI_SetColor(GUI_BLACK); /* 设置当前前景色 */
// WM_SetDesktopColor(GUI_BLUE); /* 调用此函数会自动的刷新桌面窗口 */
GUI_SetFont(&GUI_FontHZ24); /* 设置当前字体 */
GUI_Clear(); /* 清除活动窗口(如果背景是活动窗口,则清除整个显示。) */
GUI_DispStringAt("1. Please make sure the song.ttf is saved in NAND FLASH", 0, 0);
GUI_DispStringAt("2. if the song.ttf is not saved in NAND FLASH, this lab will fail", 0, 24);
// /* 等待3s后开始进行复制,方便客户看屏幕上的显示信息 */
// for(i = 0; i < 3; i++){
// sprintf(cDispBuf, "3. 3 seconds will start, %ds.. ", 3 - i);
// GUI_DispStringAt(cDispBuf, 0, 48);
// GUI_Delay(1000);
// }
GUI_DispStringAt("Loading song.ttf file from sdcard, please wait....", 0, 72);
/*
触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
*/
//TOUCH_Calibration();
/* 加载矢量字库到内部SDRAM中 */
GUI_UC_SetEncodeUTF8(); /* 使能UTF-8编码 */
_LoadFontTTF("2:/SYSTEM/FONT/simhei.ttf"); /* 将字库从SD卡中加载到emWin动态内存,即SDRAM里面 */
GUI_SetFont(&Font24); /* 设置当前矢量字体 */
GUI_Clear(); /* 清除活动窗口(如果背景是活动窗口,则清除整个显示。) */
/* 加载桌面窗口的背景图片 */
hMemBMP = BMPTask("2:/PICTURE/1.bmp", 0, 0); /* 从NAND FLASH中加载图片 */
// GUI_MEMDEV_WriteOpaqueAt(hMemBMP, 0, 0); /* 用到BMP图片的时候,调用此函数即可 */
// GUI_MEMDEV_Delete(hMemBMP); /* 释放存储设备使用的内存 */
/* 进入主界面 */
hWinMain = _CreateFrame(&_WindowsMainDisplay);
WM_CreateTimer(WM_GetClientWindow(hWinMain), /* 接受信息的窗口的句柄 */
0, /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
500, /* 周期,此周期过后指定窗口应收到消息*/
0); /* 留待将来使用,应为0 */
while(1){
GUI_Delay(10);
}
}
static WM_HWIN _CreateFrame(WM_CALLBACK* cb)
{
_hLastFrame = WM_CreateWindowAsChild(0, 0,800, 480, WM_HBKWIN, WM_CF_SHOW, cb, 0);
return _hLastFrame;
}
static void _WindowsMainDisplay(WM_MESSAGE* pMsg)
{
int id,notifyId;
char buf[12];
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId){
/* 窗口创建后立即发送,使窗口可以初始化并创建任何子窗口。 */
case WM_CREATE:
/* 设置聚焦 */
WM_SetFocus(hWin);
/* 创建按钮 */
_CreateButton(hWin, "重量1(吨)", ID_BUTTON_WEIGHT_1 , 10, 50,180, 40);
_CreateButton(hWin, "重量2(吨)", ID_BUTTON_WEIGHT_2 ,210, 50,180, 40);
_CreateText(hWin , "0.0" , ID_TEXT_WEIGHT_1 , 10, 90,180, 60, &Font48, GUI_WHITE, GUI_BLACK);
_CreateText(hWin , "0.0" , ID_TEXT_WEIGHT_2 ,210, 90,180, 60, &Font48, GUI_WHITE, GUI_BLACK);
break;
/* 窗口变为无效并应重绘时,发送到窗口。 */
case WM_PAINT:
GUI_Clear(); /* 清除活动窗口(如果背景是活动窗口,则清除整个显示。) */
/* 显示背景图片 */
GUI_MEMDEV_WriteOpaqueAt(hMemBMP, 0, 0); /* 用到BMP图片的时候,调用此函数即可 */
/* 填充顶部和底部创建2条黑色背景状态栏 */
GUI_SetColor(GUI_BLACK); /* 设置当前前景色 */
GUI_FillRect(0, 0, 800, 40);
GUI_FillRect(0, 440, 800,480);
break;
/* 告知父窗口,其子窗口中发生了某些改变。 */
case WM_NOTIFY_PARENT:
id = WM_GetId(pMsg->hWinSrc);
notifyId = pMsg->Data.v;
switch(id){
case ID_BUTTON_WEIGHT_1:
switch(notifyId){
case WM_NOTIFICATION_CLICKED: /* 按钮被按下 */
break;
case WM_NOTIFICATION_RELEASED: /* 按钮被按下并释放 */
break;
}
break;
case ID_BUTTON_WEIGHT_2:
switch(notifyId){
case WM_NOTIFICATION_CLICKED: /* 按钮被按下 */
break;
case WM_NOTIFICATION_RELEASED: /* 按钮被按下并释放 */
break;
}
break;
}
break;
/* 刷新界面数据 */
case WM_TIMER:
if(WM_GetTimerId(pMsg->Data.v) == 0){
WeightCh1 ++;
sprintf(buf, "%.1f", (float)((float)WeightCh1 / 10));/* 字符缓冲区,浮点数保留1位小数,除10转成浮点数(1位小数) */
_CreateText(hWin , buf , ID_TEXT_WEIGHT_1 , 10, 90,180, 60, &Font48, GUI_WHITE, GUI_BLACK);
/* 重启定时器 */
WM_RestartTimer(pMsg->Data.v, 500);
}
break;
default:
WM_DefaultProc(pMsg);
}
}
static WM_HWIN _CreateText(WM_HWIN hParent, const char* pText, int id, int x, int y, int w, int h,
GUI_FONT * font,int blackColor,int color)
{
WM_HWIN hText;
hText = TEXT_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, id, pText);
TEXT_SetFont (hText, font);
TEXT_SetBkColor (hText, blackColor);
TEXT_SetTextColor (hText, color);
TEXT_SetTextAlign (hText, GUI_TA_HCENTER | GUI_TA_VCENTER); /* 居中、在Y轴方向对中 */
WIDGET_SetEffect (hText, &WIDGET_Effect_3D2L); /* &WIDGET_Effect_3D 将默认效果设置为“3D”。
&WIDGET_Effect_None 将默认效果设置为“无”。
&WIDGET_Effect_Simple 将默认效果设置为“简单”。 */
return hText;
}
static WM_HWIN _CreateButton(WM_HWIN hParent, const char* pText, int id, int x, int y, int w, int h)
{
WM_HWIN hButton;
hButton = BUTTON_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, id);
BUTTON_SetText (hButton, pText);
BUTTON_SetFont (hButton, &Font24);
BUTTON_SetBkColor (hButton, 0, 0xB8B8B8); /* 0:BUTTON_CI_DISABLED ,设置按钮禁用时要使用的颜色。 */
BUTTON_SetBkColor (hButton, 1, 0xE0E0E0); /* 1:BUTTON_CI_PRESSED ,设置按钮按下时要使用的颜色。 */
BUTTON_SetBkColor (hButton, 2, 0xC0C0C0); /* 2:BUTTON_CI_UNPRESSED,设置按钮未按下时要使用的颜色。*/
BUTTON_SetTextColor (hButton, 0, 0x000000); /* 0:BUTTON_CI_DISABLED ,设置按钮禁用时要使用的颜色。 */
BUTTON_SetTextColor (hButton, 1, 0x000000); /* 1:BUTTON_CI_PRESSED ,设置按钮按下时要使用的颜色。 */
BUTTON_SetTextColor (hButton, 2, 0x000000); /* 2:BUTTON_CI_UNPRESSED,设置按钮未按下时要使用的颜色。*/
WIDGET_SetEffect (hButton, &WIDGET_Effect_3D2L); /* &WIDGET_Effect_3D 将默认效果设置为“3D”。
&WIDGET_Effect_None 将默认效果设置为“无”。
&WIDGET_Effect_Simple 将默认效果设置为“简单”。 */
/* 设置接收输入焦点的能力 */
BUTTON_SetFocussable(hButton, 1);
return hButton;
} |
|