硬汉嵌入式论坛

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

[emWin] 有关多任务之间发送消息的问题,其中一个是EMWIN任务

[复制链接]

4

主题

9

回帖

4

积分

新手上路

砥砺前行,大道自成

积分
4
发表于 2017-2-10 17:41:02 | 显示全部楼层 |阅读模式
我想把一个任务中收到的数据发送到EMWIN中的窗口的TEXT控件来显示,之前打算用UCOS的消息队列来进行发送接收消息,试了下不行,应该是EMWIN有自己的消息机制,然后我想到用WM_USER,
用WM_SendMessage函数来发送,但目前没成功,请教各位有什么好办法
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2017-2-11 00:34:21 | 显示全部楼层
用uCOS的消息队列可以的,你在emWin任务的大循环里面做一个消息接收即可。读取到数据的话,更新text控件。

用emWin的消息机制,WM_SendMessage或者WM_SendMessageNoPara不适合用来传递数据,这两个函数主要用来传递控件消息用的。
多任务里面用这两个函数的话,直接将你接收到的变量设置成全局变量即可,不存在冲突问题。
回复

使用道具 举报

4

主题

9

回帖

4

积分

新手上路

砥砺前行,大道自成

积分
4
 楼主| 发表于 2017-2-12 10:35:39 | 显示全部楼层

回 eric2013 的帖子

eric2013:用uCOS的消息队列可以的,你在emWin任务的大循环里面做一个消息接收即可。读取到数据的话,更新text控件。

用emWin的消息机制,WM_SendMessage或者WM_SendMessageNoPara不适合用来传递数据,这两个函数主要用来传递控件消息用的。
多任务里面用这两个函数的话,直接将你接收到的 .. (2017-02-11 00:34) 
我试了在while中接收消息结果会死机
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2017-2-12 10:50:58 | 显示全部楼层

回 11涛神11 的帖子

11涛神11:我试了在while中接收消息结果会死机 (2017-02-12 10:35)
你的工程移植或者使用方法估计有bug,先做个简单的UCOS例子,单独测试下消息队列,成功了再往emWin上面移植。
回复

使用道具 举报

4

主题

9

回帖

4

积分

新手上路

砥砺前行,大道自成

积分
4
 楼主| 发表于 2017-2-12 17:00:47 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的工程移植或者使用方法估计有bug,先做个简单的UCOS例子,单独测试下消息队列,成功了再往emWin上面移植。
 (2017-02-12 10:50) 
我把GUI任务的堆栈大小改了下,子窗口可以更新TEXT的内容了,就是在while中加的,但是我一旦退出子窗口后就不能再进入子窗口了
回复

使用道具 举报

4

主题

9

回帖

4

积分

新手上路

砥砺前行,大道自成

积分
4
 楼主| 发表于 2017-2-12 17:01:23 | 显示全部楼层

回 11涛神11 的帖子

11涛神11:我把GUI任务的堆栈大小改了下,子窗口可以更新TEXT的内容了,就是在while中加的,但是我一旦退出子窗口后就不能再进入子窗口了 (2017-02-12 17:00) 
是通过点击ICONVIEW控件进入子窗口的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2017-2-13 09:09:29 | 显示全部楼层

回 11涛神11 的帖子

11涛神11:是通过点击ICONVIEW控件进入子窗口的 (2017-02-12 17:01) 
子窗口是如何调用的,发这部分的代码看下。
回复

使用道具 举报

4

主题

9

回帖

4

积分

新手上路

砥砺前行,大道自成

积分
4
 楼主| 发表于 2017-2-14 22:33:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:

子窗口是如何 QQ图片20170214223532.png 调用的,发这部分的代码看下。

file:///C:\\Users\\asus\\AppData\\Roaming\\Tencent\\Users\\1425146065\\QQ\\WinTemp\\RichOle\\}%KOSZXTCLGWF%_37`1UW{H.png
回复

使用道具 举报

4

主题

9

回帖

4

积分

新手上路

砥砺前行,大道自成

积分
4
 楼主| 发表于 2017-2-14 22:34:41 | 显示全部楼层

回 11涛神11 的帖子

11涛神11: (2017-02-14 22:33) 
在主窗口的回调函数确定选择的ICONVIEW控件,然后进入子窗口
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2017-2-15 00:14:41 | 显示全部楼层

回 11涛神11 的帖子

11涛神11:在主窗口的回调函数确定选择的ICONVIEW控件,然后进入子窗口 (2017-02-14 22:34) 
这部分没问题的。
回复

使用道具 举报

4

主题

9

回帖

4

积分

新手上路

砥砺前行,大道自成

积分
4
 楼主| 发表于 2017-2-15 10:33:45 | 显示全部楼层

回 eric2013 的帖子

eric2013:

这部分没问题的。
  1. void MainTask()
  2. {
  3.     u8 i;
  4.     CPU_SR_ALLOC();
  5.     char *p;
  6.     OS_ERR err;
  7.     /* 使能所有窗口使用emWin内存设备,包括桌面窗口 */
  8.     WM_SetCreateFlags(WM_CF_MEMDEV);
  9.    
  10.     /* 初始化并创建对话框 */
  11.     GUI_Init();
  12.     WM_SetDesktopColor(GUI_BLUE);
  13.    
  14.     /* 设置皮肤上 */
  15.     FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  16.     BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  17.         
  18.     hWinMain = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  19.    
  20.     /*在指定位置创建指定尺寸的ICONVIEW 小工具*/
  21.     hWinICON = ICONVIEW_CreateEx(60,                     /* 小工具的最左像素(在父坐标中)*/
  22.                                            140,                       /* 小工具的最上像素(在父坐标中)*/
  23.                                              440,                    /* 小工具的水平尺寸(单位:像素)*/
  24.                                              700,               /* 小工具的垂直尺寸(单位:像素)*/
  25.                                  hWinMain,           /* 父窗口的句柄。如果为0,则新小工具将成为桌面(顶级窗口)的子窗口*/
  26.                                              WM_CF_SHOW | WM_CF_HASTRANS,       /* 窗口创建标志。为使小工具立即可见,通常使用 WM_CF_SHOW */
  27.                                  0,       //ICONVIEW_CF_AUTOSCROLLBAR_V,     /* 默认是0,如果不够现实可设置增减垂直滚动条 */
  28.                                              GUI_ID_ICONVIEW0,                     /* 小工具的窗口ID */
  29.                                              128,                     /* 图标的水平尺寸 */
  30.                                              128);            /* 图标的垂直尺寸 */
  31.    
  32.     /* 向ICONVIEW 小工具添加新图标 */
  33.     for (i = 0; i < GUI_COUNTOF(_aBitmapItem); i++)
  34.     {   
  35.         ICONVIEW_AddBitmapItem(hWinICON, _aBitmapItem[i].pBitmap,_aBitmapItem[i].pText );
  36.     }
  37.    
  38.     /* 设置小工具的背景色 32 位颜色值的前8 位可用于alpha混合处理效果*/
  39.     ICONVIEW_SetBkColor(hWinICON, ICONVIEW_CI_SEL, GUI_WHITE | 0x80000000);
  40.    
  41.     /* 设置字体 */
  42.     ICONVIEW_SetFont(hWinICON, &GUI_FontHZ24);
  43.    
  44.     /* 设置图标在x 或y 方向上的间距*/
  45.     ICONVIEW_SetSpace(hWinICON, GUI_COORD_Y, 60);
  46.     ICONVIEW_SetSpace(hWinICON, GUI_COORD_X, 100);
  47.    
  48.     /* 设置对齐方式 在5.22版本中最新加入的 */
  49.     ICONVIEW_SetIconAlign(hWinICON, ICONVIEW_IA_HCENTER|ICONVIEW_IA_TOP);            
  50.    
  51.     while(1)
  52.     {
  53.         TEXT_SetText(WM_GetDialogItem(hWinInfo,ID_TEXT_2),temp);
  54.         TEXT_SetText(WM_GetDialogItem(hWinInfo,ID_TEXT_4),humid);
  55.         TEXT_SetText(WM_GetDialogItem(hWinInfo,ID_TEXT_6),light);
  56.         TEXT_SetText(WM_GetDialogItem(hWinInfo,ID_TEXT_8),air);
  57.         GUI_Delay(50);
  58.     }
  59. }
复制代码
这是我的主任务函数,在while(1)中更新子窗口的控件,然后一旦退出子窗口后,子窗口的句柄就无效了,TEXT_SetText()函数的参数就错误了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2017-2-16 01:39:36 | 显示全部楼层

回 11涛神11 的帖子

11涛神11:void MainTask()
{
    u8 i;
    CPU_SR_ALLOC();
....... (2017-02-15 10:33) 
更新TEXT不要放在主函数里面,你的大while循环里面最好仅放一个GUI_Delay就好了,
你需把下面这些更新放在窗口的回调函数里面实现就行,需要定时更新的话,使用emWIn支持的定时器功能即可。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2019-5-8 09:47:17 | 显示全部楼层
eric2013 发表于 2017-2-16 01:39
更新TEXT不要放在主函数里面,你的大while循环里面最好仅放一个GUI_Delay就好了,
你需把下面这些更新放在 ...

硬汉哥,我看xQueueReceive 这个函数每次需要设置阻塞时间,是不是放到emWin的while里阻塞会影响执行效率。那xQueueReceive放在emWin的定时器中呢,会不会影响emWin的运行效率,关于定时器中的阻塞时间应该如何设置呢?能不能给点建议
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-5-9 01:22:04 | 显示全部楼层
石斛 发表于 2019-5-8 09:47
硬汉哥,我看xQueueReceive 这个函数每次需要设置阻塞时间,是不是放到emWin的while里阻塞会影响执行效率 ...

不好意思,貌似有在V6群看到你的这个消息,但是没有顾上回复。

可以在while大循环里面,这样还实时点。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 00:09 , Processed in 0.409238 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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