硬汉嵌入式论坛

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

[有问必答] 回调函数,是不是相当于进入了死循环,想要用按键控制电机运行和停止,那电机运行的

[复制链接]

25

主题

135

回帖

210

积分

高级会员

积分
210
发表于 2015-8-25 14:58:22 | 显示全部楼层 |阅读模式
使用按键控制电机运行和停止,但是电机运行是有步骤的,有一个运行流程,在这个流程中可以用按键停止,这个运行过程较长,在回调函数里,只能处理电机运行或停止的标志位,这种情况应该怎么做呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2015-8-25 23:39:08 | 显示全部楼层
不是进入死循环,可以放在回调函数里面,如果是放在回调函数里面。
在button的点击消息里面可以设置一个text文件控件或者button本身,说明下电机启动中,当程序执行到button的释放消息时,可以更新启动成功。

或者楼主可以在button的消息里面发送一个标志,如果用RTOS就发送一个消息队列等通信机制通知一个任务去执行这个流程。
回复

使用道具 举报

25

主题

135

回帖

210

积分

高级会员

积分
210
 楼主| 发表于 2015-8-26 08:26:17 | 显示全部楼层

回 eric2013 的帖子

eric2013:
不是进入死循环,可以放在回调函数里面,如果是放在回调函数里面。
在button的点击消息里面可以设置一个text文件控件或者button本身,说明下电机启动中,当程序执行到button的释放消息时,可以更新启动成功。

或者楼主可以在button的消息里面发送一个标志,如果用RTOS就发送一个消息队列等通信机制通知一个任务去执行这个流程。
但是电机运行程序很长,如果放到Button释放消息里,在电机运行过程中,控件不都失效了吗,控件都没法操作了,也就相当于电机程序和回调函数不能同时运行
static void _cbCallback(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
            PaintDialog(pMsg);
            break;
        case WM_INIT_DIALOG:
            InitDialog(pMsg);
            break;
        case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);
                    break;
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hWin, 0);
                    break;
            }
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;        
            switch (Id)
            {
                case GUI_ID_OK:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        GUI_EndDialog(hWin, 0);
                    break;
                case GUI_ID_CANCEL:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        GUI_EndDialog(hWin, 0);
                    break;
                case GUI_ID_BUTTON0:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:

                            break;
                        case WM_NOTIFICATION_RELEASED:
                            if(ButtonStatus==1)
                            {                                                                                                               
                                      GUI_EndDialog(hWin, 1);
                                     s_ucRA8875BusyNow=1;
                            }
                           else
                           {
                                    BUTTON_SetText(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),"停止");
                                    ButtonStatus=1;   
                                       MotorRun();                                                                                      
                           }                                                                                                                                
                            break;
                        case WM_NOTIFICATION_MOVED_OUT:
                            break;
                    }
                    break;

            }
            break;
        default:
           WM_DefaultProc(pMsg);
    }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2015-8-26 14:11:37 | 显示全部楼层

回 明天tcx 的帖子

明天tcx:但是电机运行程序很长,如果放到Button释放消息里,在电机运行过程中,控件不都失效了吗,控件都没法操作了,也就相当于电机程序和回调函数不能同时运行
static void _cbCallback(WM_MESSAGE * pMsg)
{
    int NCode, Id;
....... (2015-08-26 08:26) 
那还是发生任务消息或者设置标志比较合适。
回复

使用道具 举报

25

主题

135

回帖

210

积分

高级会员

积分
210
 楼主| 发表于 2015-8-26 14:38:38 | 显示全部楼层

回 eric2013 的帖子

eric2013:那还是发生任务消息或者设置标志比较合适。 (2015-08-26 14:11) 
这样是不是一定要用RTOS,不用行不行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2015-8-26 21:34:32 | 显示全部楼层

回 明天tcx 的帖子

明天tcx:这样是不是一定要用RTOS,不用行不行 (2015-08-26 14:38)
可以的,你可以设置一个全局变量标志,在button的消息里面设置这个标志,然后主函数做一个检测就行。
回复

使用道具 举报

25

主题

135

回帖

210

积分

高级会员

积分
210
 楼主| 发表于 2015-8-27 10:44:46 | 显示全部楼层

回 eric2013 的帖子

eric2013:可以的,你可以设置一个全局变量标志,在button的消息里面设置这个标志,然后主函数做一个检测就行。
 (2015-08-26 21:34) 
可是到主函数就必须先退出回调函数吧,退出了回调函数控件不就没用了吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2015-8-27 10:57:49 | 显示全部楼层

回 明天tcx 的帖子

明天tcx:可是到主函数就必须先退出回调函数吧,退出了回调函数控件不就没用了吗 (2015-08-27 10:44) 
对的,控件就是起到了一个设置作用,就像咱们在ATM上面取钱,点击了取钱按钮后,剩下就是ATM机将钱取出来。
回复

使用道具 举报

25

主题

135

回帖

210

积分

高级会员

积分
210
 楼主| 发表于 2015-8-27 11:26:02 | 显示全部楼层

回 eric2013 的帖子

eric2013:对的,控件就是起到了一个设置作用,就像咱们在ATM上面取钱,点击了取钱按钮后,剩下就是ATM机将钱取出来。 (2015-08-27 10:57) 
但是我还想在电机运行过程中能用按键使电机停止
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 22:44 , Processed in 0.178387 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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