硬汉嵌入式论坛

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

[emWin] 加载.dta 文件时花屏问题

[复制链接]

100

主题

94

回帖

394

积分

高级会员

积分
394
发表于 2022-7-29 16:11:06 | 显示全部楼层 |阅读模式
图片加载(dta文件)和界面显示放在一个线程中处理,显示正常,但是图片加载要好几秒,屏幕白屏状态,显得比较慢
现在把图片加载放在单独的线程中,加载过程中UI线程在屏幕上画圈圈。但是产生新的问题:画圈的过程会出现闪烁几下,

问题是:如何良好的实现UI 动态刷屏 和 加载文件的协同处理?
(SD+fat32)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-7-30 11:20:27 | 显示全部楼层
图片是加载到哪里,这种情况,花圈闪烁不正常,可以着手优化下。
回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2022-8-1 10:07:17 | 显示全部楼层
eric2013 发表于 2022-7-30 11:20
图片是加载到哪里,这种情况,花圈闪烁不正常,可以着手优化下。

[C] 纯文本查看 复制代码
	filesize = f_size(&file);
	hMem = GUI_ALLOC_AllocZero(filesize);////申请一块内存空间,并将其清零
	_acBuffer = GUI_ALLOC_h2p(hMem);////将申请到的内存句柄转换成指针类型

	result = f_read(&file, _acBuffer, filesize, &bw);
	if (result != FR_OK)
	{
		ERROR("f_read(%s) =%d\n",pcFilename,result);
		f_close(&file);		
		GUI_ALLOC_Free(hMem);

		return ERR_FILE;
	}

	GUI_CreateBitmapFromStream(&bmp, &palette, _acBuffer);

	/*创建内存设备,并将 BMP 图片绘制到此内存设备里面,此内存设备要在主程序中用到,不要释放*/
	*hpMenDev = GUI_MEMDEV_CreateFixed(0,0,bmp.XSize,bmp.YSize,GUI_MEMDEV_HASTRANS,GUI_MEMDEV_APILIST_32,GUI_COLOR_CONV_8888);
	GUI_MEMDEV_Select(*hpMenDev);
	GUI_SetBkColor(GUI_TRANSPARENT);
	GUI_Clear();
	GUI_DrawBitmap(&bmp, 0, 0);
	GUI_MEMDEV_Select(0);

	GUI_ALLOC_Free(hMem);


我发加载图片线程包含如上emwin 接口,相当于多线程调用emwin,这样会导致这个问题么?如果会,如何在多线程中调用emwin?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-8-1 10:44:27 | 显示全部楼层
wen 发表于 2022-8-1 10:07
[mw_shl_code=c,true]        filesize = f_size(&file);
        hMem = GUI_ALLOC_AllocZero(filesize);////申请一块 ...

emWin最好单任务,多任务各种坑。
回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2022-8-1 13:50:39 | 显示全部楼层
本帖最后由 wen 于 2022-8-1 13:56 编辑
eric2013 发表于 2022-8-1 10:44
emWin最好单任务,多任务各种坑。

单步调试时,发现跟多线程调用emwin没有关系,原因是加载线程在读较大文件(字库文件)时,导致UI闪屏。也就是说在执行f_read时,影响到了画圈线程。两个线程优先级一样。这是什么情况?好像读大文件和花圈UI线程没法融洽并发?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-8-1 15:20:52 | 显示全部楼层
wen 发表于 2022-8-1 13:50
单步调试时,发现跟多线程调用emwin没有关系,原因是加载线程在读较大文件(字库文件)时,导致UI闪屏。 ...

放在一个任务里面试试,一测便知。

按说这种问题很简单,多试试就搞定了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-24 01:35 , Processed in 0.341545 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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