硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5690|回复: 9
收起左侧

[emWin] 求解答窗口切换经常卡死的问题

[复制链接]

6

主题

19

回帖

37

积分

新手上路

积分
37
发表于 2015-5-21 17:47:36 | 显示全部楼层 |阅读模式
用的emWin。 通过按键窗口之间切换用的是BringToBop(),我显示的第二个窗口里有一个ListView,如果从主窗口切过来不做任何操作能正常返回主窗口,如果在切换到第二个窗口后,按按键改变了ListView选择的行,则切回主窗口会卡死
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2015-5-21 22:34:42 | 显示全部楼层
描述的稍有些复杂,不是很理解,是不是一个主界面,主界面上面有两个按键,每个按键可以打开一个窗口,这两个按键打开的窗口来回切换容易死机?
回复

使用道具 举报

6

主题

19

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2015-5-22 11:34:30 | 显示全部楼层
先介绍下用到的窗口
        程序初始化阶段共创建了三个窗口:WinMap, WinList, WinSetting;WinMap包含一个画图的区域和一个文本显示的区域;WinList包含一个ListView和文本显示区域;WinSetting包含几个小工具。初始化时WinMap通过BringToTop作为初始窗口。
操作:
       在WinMap中,按下F1按键,调用BringToTop切换到WinList,这步没有问题,如果没通过上下按键改变WinList中ListView中的选中条目,按F1 返回WinMap也是没问题的。
问题出在:
      若在WinList中通过按键改变了ListView中的选中条目后,再切换窗口就会卡死。
我自己找的出问题的函数:在WinList中通过按键 “UP”和“DOWN”改变ListView中的条目,同时在文本显示区域显示该条目各项信息,我用的函数是
  1. /***************************************************************************************
  2.     Function:       showCurrentBoatInfo()
  3.     Description:    Show information of the boat,which has been selected in listview
  4.     Calls:         
  5.     Called By:      _cbWindowAllList()
  6.     Table Accessed:
  7.     Table Updated:  
  8.   Input:          WM_HWIN (Handle of current dialog)
  9.     Output:         void
  10.     Return:         void
  11.   @Attention:     There are two handle in this function's statement:
  12.                   dialog's handle &  listview's handle.Do no make mistake.
  13. ****************************************************************************************/
  14. void showCurrentBoatInfo(WM_HWIN hWin)
  15. {
  16.     short i = 0;
  17.     short row = 0;
  18.     WM_HWIN  hdListView  = 0;
  19.   char strBuf[10];
  20.     int boatID = 0;
  21.    
  22.    
  23.     hdListView  = WM_GetDialogItem(hWin,GUI_ID_LISTVIEW0);
  24.     row  = LISTVIEW_GetSel(hdListView);///得到ListView当前所选的行
  25.    
  26.     /**@brief 找到所选行的MMSI项对应的渔船,并显示渔船信息
  27.     *
  28.     *@details:总共三条船,根据所选行的ID项找到ID对应的船在数组中的索引
  29.     */
  30.     for(i=0;i<3;i++)
  31.     {
  32.         LISTVIEW_GetItemText(WM_GetDialogItem(hWin,GUI_ID_LISTVIEW0),2,row,strBuf,10);
  33.         boatID  = strtoi(strBuf);///把所选行的ID项的文本转换为整数
  34.         if(test[i].user_id == boatID)///根据ID找到对应的船的索引
  35.         {
  36.             row = i;
  37.             break;
  38.         }
  39. ///显示该船的各项信息
  40. ///将id转化成字符转显示
  41.     ttoi(test[row].user_id,strBuf);
  42.     TEXT_SetText(WM_GetDialogItem(hWin,TEXT_ID_MMSI),strBuf);
  43. ///将纬度转化为字符串显示
  44.     lol_to_c(test[row].latitude,strBuf);
  45.     TEXT_SetText(WM_GetDialogItem(hWin,TEXT_ID_LATITUDE),strBuf);
  46. ///将经度转化为字符串显示
  47.     lol_to_c(test[row].longitude,strBuf);
  48.   TEXT_SetText(WM_GetDialogItem(hWin,TEXT_ID_LONGITUDE),strBuf);
  49.    
  50.     ttoi(test[row].SOG,strBuf);
  51.     TEXT_SetText(WM_GetDialogItem(hWin,TEXT_ID_SOG),strBuf);
  52.    
  53.     ttoi(test[row].true_heading,strBuf);
  54.     TEXT_SetText(WM_GetDialogItem(hWin,TEXT_ID_HEADING),strBuf);
  55. }
复制代码
在捕捉到"UP" 或者"DOWN"后先将ListView的条目上移或下移一行,然后调用上面这个函数。如果我在“UP”和“DOWN”的处理语句里不调用这个函数的话,以上描述的问题则不会出现,当然我要显示船的信息的功能也没有了。
回复

使用道具 举报

6

主题

19

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2015-5-22 11:38:05 | 显示全部楼层

回 eric2013 的帖子

eric2013:描述的稍有些复杂,不是很理解,是不是一个主界面,主界面上面有两个按键,每个按键可以打开一个窗口,这两个按键打开的窗口来回切换容易死机? (2015-05-21 22:34) 
和你描述的差不多,只不过如果不改变ListView中所选的条目的话,就不会卡死
回复

使用道具 举报

6

主题

19

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2015-5-22 11:44:57 | 显示全部楼层
初次接触emWin,好像官方例程里很少见BringToTop,能稍详细的讲解一下像这样有多个窗口切换的策略吗?我用的是把三个窗口用CreateWindowAsChile创建,切换用的都是BringToTop
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2015-5-22 15:58:52 | 显示全部楼层
隐藏功能很好用的。不显示的窗口是可以先隐藏起来,需要显示的,让他显示出来。

另外你出问题的这个函数没有看出有什么问题,你可以试试注释部分函数看看是那个函数导致的。
回复

使用道具 举报

6

主题

19

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2015-5-22 17:08:29 | 显示全部楼层

回 eric2013 的帖子

eric2013:隐藏功能很好用的。不显示的窗口是可以先隐藏起来,需要显示的,让他显示出来。

另外你出问题的这个函数没有看出有什么问题,你可以试试注释部分函数看看是那个函数导致的。 (2015-05-22 15:58) 
通过实验发现如果传入 TEXT_SetText()函数的strBuf  如果是字符转常量的话就没有问题,这个TEXT_SetText() 不能接受字符指针???
回复

使用道具 举报

6

主题

19

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2015-5-22 17:09:19 | 显示全部楼层

回 sealedghost 的帖子

sealedghost:通过实验发现如果传入 TEXT_SetText()函数的strBuf  如果是字符转常量的话就没有问题,这个TEXT_SetText() 不能接受字符指针??? (2015-05-22 17:08) 
写错了 字符串常量
回复

使用道具 举报

5

主题

69

回帖

5

积分

初级会员

积分
5
发表于 2015-5-29 16:23:33 | 显示全部楼层

回 sealedghost 的帖子

sealedghost:写错了 字符串常量 (2015-05-22 17:09) 
调试看下窗口句柄对不对,不能对空句柄(就是不存在的控件)进行操作
回复

使用道具 举报

11

主题

103

回帖

31

积分

初级会员

积分
31
发表于 2015-11-11 09:11:56 | 显示全部楼层
多个窗口切换死机,有可能是你堆栈没给够 (UCOS)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 12:18 , Processed in 0.044621 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表