硬汉嵌入式论坛

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

[emWin] Listview控件操作卡死问题

[复制链接]

10

主题

46

回帖

76

积分

初级会员

积分
76
发表于 2020-10-12 11:50:48 | 显示全部楼层 |阅读模式
    项目进行到尾声了,但是经常会卡死在listview界面,程序进入HardFault。还希望各位坛友帮一把,分析一下是什么问题。    界面的Listview控件需要根据不同选项,显示不同的列表内容。切换时先逐行把之前添加的行全部删除,然后再依次添加新的行。行数最多的大概200行。死机情况全部出现在切换左侧树图类型时(listview刷新),死机概率大概为5%,切换操作快则易出现。
    查看死机的地方大概在执行GUI_Exec()函数里的listview GUI库函数某个地方。程序执行列表增、删操作的时候,关闭中断和关闭任务调度都试过了,还是会出现。文本长度改短也不行。感觉已经没招了。

                        //清空所有行的代码

                        j=LISTVIEW_GetNumRows(hListview);
                        for (i = 0; i<j; i++)  
                        {
                                LISTVIEW_DeleteRow(hListview, 0);               
                        }




ScrShot000.bmp
ScrShot001.bmp
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2020-10-12 14:00:14 | 显示全部楼层
可以换个思路试试,一个treeview的item对应一个listview,切换item时,这样listview整体创建或者删除(不需要按行和列来处理)
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2020-10-12 14:07:18 | 显示全部楼层
关中断试过了,那么应该不是增加或者删减过程被打断出现异常之类的问题,是否因为栈空间不够大导致?在内存允许的情况下先尽量加大,确定是不是栈问题。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-10-12 14:39:17 | 显示全部楼层
h_007 发表于 2020-10-12 14:00
可以换个思路试试,一个treeview的item对应一个listview,切换item时,这样listview整体创建或者删除(不需 ...

确实是个好建议,就是这个treeview里面的item有点太多了。大概4x10个,如果都是独立的listview控件,不知道啥效果,就按照这个思路搞试试,谢谢啦。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-10-12 15:11:07 | 显示全部楼层
billy 发表于 2020-10-12 14:07
关中断试过了,那么应该不是增加或者删减过程被打断出现异常之类的问题,是否因为栈空间不够大导致?在内存 ...

APPGUI_STK_SIZE 4K和8K都试了,现象一样的。好像也不是任务堆栈的问题。不知道startup_stm32f427xx.s文件里的栈大小 Stack_Size      EQU     0xA00; 会不会影响这个?
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2020-10-12 15:35:49 | 显示全部楼层
UI界面总思路:
1. treeview,listview界面相互独立,treeview为主,listview的创建和删除取决于treeview的item。
2. 主循环创建一个状态机,treeview主界面用状态机switch...case切换(一个item对应一个状态),listview按需创建和删除。
3. listview预先用guibuilder画好,一般没什么问题,代码容易维护和管理。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2020-10-12 15:39:38 | 显示全部楼层
zhoutao318 发表于 2020-10-12 15:11
APPGUI_STK_SIZE 4K和8K都试了,现象一样的。好像也不是任务堆栈的问题。不知道startup_stm32f427xx.s文 ...

那估计不是栈的问题,你也可以试试加大这个,看看情况,这个栈好像是中断的时候用到?
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-10-12 15:52:19 | 显示全部楼层
h_007 发表于 2020-10-12 15:35
UI界面总思路:
1. treeview,listview界面相互独立,treeview为主,listview的创建和删除取决于treeview ...

谢谢提供的详细方案。您说的对,两个控件去耦合是必要的。希望独立起来这个问题就解决了。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-10-12 15:56:40 | 显示全部楼层
如图,死机时程序进入Hardfault时,call stack+local窗口的截屏。一般Hardfault前面几个函数就是可能导致死机的地方,但是这是在GUI的库函数里,不好分析。

call stack

call stack
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-10-13 10:03:45 | 显示全部楼层
h_007 发表于 2020-10-12 15:35
UI界面总思路:
1. treeview,listview界面相互独立,treeview为主,listview的创建和删除取决于treeview ...

问题已解决,谢谢指导
总结经验如下:  1.有时候代码要以空间换取时间。
  2.要敢于否定之前的工作,换个思路另辟蹊径,也许就是柳暗花明。
回复

使用道具 举报

14

主题

31

回帖

73

积分

初级会员

积分
73
发表于 2020-10-13 10:22:44 | 显示全部楼层
zhoutao318 发表于 2020-10-13 10:03
问题已解决,谢谢指导。
总结经验如下:  1.有时候代码要以空间换取时间。
  2.要敢于否定之前的工作 ...

楼主是将listview整体创建删除后解决的吗?
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-10-13 10:49:04 | 显示全部楼层
石头123 发表于 2020-10-13 10:22
楼主是将listview整体创建删除后解决的吗?

类似我这中listview切换频繁的操作界面,可以在界面初始化的时候,创建所有的listview控件,用的时候,显示那个就show那个,不显示就hide起来. 窗口关闭的时候,会自动删除释放之前创建的所有控件。避免频繁创建删除导致的卡顿或者死机问题。
希望此经验可以帮助遇到类似问题的人。
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2020-10-13 20:27:09 | 显示全部楼层
那么快就解决问题了。。。恭喜
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 19:28 , Processed in 0.504533 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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