|
本帖最后由 WSTON 于 2021-6-29 12:37 编辑
项目中在button中绘制内容,发现跑一段时间总会卡,用SERRGER Handler分析发现总是卡在 button回调函数中的GUI_DispStringInRect函数。然后自己另外创建一个新的测试窗口,发现还是会卡,不知道哪里写错啦,我这边用的是H7,裸跑,跑了不到一分钟就死机进入硬件中断了,还是卡在回调函数中的GUI_DispStringInRect函数。也试过把定时器时间改为100ms,问题依旧。请教各位好汉!
- #include "DIALOG.h"
- #define ID_WINDOW_0 (GUI_ID_USER + 0x00)
- #define ID_BUTTON_0 (GUI_ID_USER + 0x01)
- #define ID_BUTTON_1 (GUI_ID_USER + 0x02)
- #define ID_BUTTON_2 (GUI_ID_USER + 0x03)
- #define ID_BUTTON_3 (GUI_ID_USER + 0x05)
- #define ID_TIMER (GUI_ID_USER + 0x06)
- int testCnt;
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 0, 0, 400, 240, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 400, 0, 400, 240, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "Button", ID_BUTTON_2, 0, 240, 400, 240, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "Button", ID_BUTTON_3, 400, 240, 400, 240, 0, 0x0, 0 },
- };
- static void _cbTBT(WM_MESSAGE * pMsg)
- {
- char disbuf[50];
- GUI_RECT rect = {0, 0, 0, 0};
- rect.x1 = WM_GetWindowSizeX(pMsg->hWin);
- rect.y1 = WM_GetWindowSizeY(pMsg->hWin);
-
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- {
- GUI_SetFont(GUI_FONT_32B_ASCII);
- switch(WM_GetId(pMsg->hWin))
- {
- case ID_BUTTON_0:
- memset(disbuf, 0, sizeof(disbuf));
- sprintf(disbuf, "Button0 %d", testCnt);
- GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
- GUI_SetFont(GUI_FONT_32B_ASCII); //test code wait for breakpoint
- break;
- case ID_BUTTON_1:
- memset(disbuf, 0, sizeof(disbuf));
- sprintf(disbuf, "Button1 %d", testCnt*2);
- GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
- GUI_SetFont(GUI_FONT_32B_ASCII); //test code wait for breakpoint
- break;
-
- case ID_BUTTON_2:
- memset(disbuf, 0, sizeof(disbuf));
- sprintf(disbuf, "Button2 %d", testCnt + 10);
- GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
- GUI_SetFont(GUI_FONT_32B_ASCII); //test code wait for breakpoint
- break;
-
- case ID_BUTTON_3:
- memset(disbuf, 0, sizeof(disbuf));
- sprintf(disbuf, "Button3 %d", testCnt + 20);
- GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
- GUI_SetFont(GUI_FONT_32B_ASCII); //test code wait for breakpoint
- break;
- }
-
- break;
- }
-
- default:
- BUTTON_Callback(pMsg);
- }
- }
- static void _cbDialog(WM_MESSAGE * pMsg) {
- int NCode;
- int Id;
- GUI_HWIN hItem;
- switch (pMsg->MsgId) {
-
- case WM_INIT_DIALOG:
- {
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
- WM_SetCallback(hItem, _cbTBT);
-
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
- WM_SetCallback(hItem, _cbTBT);
-
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
- WM_SetCallback(hItem, _cbTBT);
-
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
- WM_SetCallback(hItem, _cbTBT);
-
- WM_CreateTimer(pMsg->hWin, ID_TIMER, 100, 0);
- break;
- }
-
- case WM_TIMER:
- {
- int timerId = WM_GetTimerId(pMsg->Data.v);
-
- if(timerId == ID_TIMER)
- {
- testCnt++;
- WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0));
- WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1));
- WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2));
- WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3));
- WM_RestartTimer(pMsg->Data.v, 100);
- }
-
- break;
- }
-
-
- default:
- WM_DefaultProc(pMsg);
- break;
- }
- }
- WM_HWIN CreateWindow(void) {
- WM_HWIN hWin;
- hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
- return hWin;
- }
- /*************************** End of file ****************************/
复制代码
|
|