如何在程序退出之前给变量赋零值并发送给另台计算机

alongdawn 2008-02-25 04:42:04
我想用VC++实现两台电脑的数据通讯.目的是将联在机器1上的力反馈操纵杆力信号发给机器2以控制现场的机器人,再把机器人在环境中产生的力反馈经机器2发送回操纵杆.问题是如果在程序运行过程中,点击机器1上的"退出"按钮,操纵杆停止工作时,机器2上的控制力将保持机器1刚退出时的数值.我个人认为当机器1退出程序时,两台计算机的通讯就中断了,但是机器1的程序仍然在运行,变量值也就保留了下来.我就编写了一段"退出"程序,期望在退出之前把力的值赋0,程序如下:
case WM_COMMAND:

switch( LOWORD(wParam) )

{

case IDCANCEL:

Joystick_x = 0;//Reset and send joystick input to stop the CWA motion

Joystick_y = 0;

sendJoystickPos(Joystick_x,Joystick_y);

Sleep(100);

EndDialog( hDlg, 0 );

return TRUE;

}

其中Joystick_x 和Joystick_y分别表示操纵杆力的两个分量.可是运行程序时,控制机器人的力还是没有改变,这是怎么回事呢?请高人不吝赐教,谢谢!
...全文
103 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
alongdawn 2008-02-27
  • 打赏
  • 举报
回复
yisea123:

我把sleep改为while循环,在循环体内重复执行sendJoystickPos函数多次,果然解决问题了.

arong1234:
我觉得通过消息发送数据也是可行的,只是要给接收方一定的时间.在我的案例中,机器2每隔100毫秒接收一次数据,所以我只要保证while循环体的执行时间大于100毫秒就行了.

Chiyer的建议也许也是可行的,只是可能复杂一些,等我有时间再尝试一下,在此一并表示感谢.
alongdawn 2008-02-26
  • 打赏
  • 举报
回复
arong1234说得很有道理,我的问题可能就出在发消息通知时信息丢失了,可是检测存活性怎么实现呢?能否说得具体一点怎么操作呢?我通讯程序的大体框架如下:

#include "Client.h"//file that defines the function of sendJoystickPos().

double Joy_x=0;
double Joy_y=0;

void mycom(HWND,hDlg);//declaration of data communication function

void mycom(HWND, hDlg)
{
int xReading = XXX; // integer value of X element of joystick input
int yReading = XXX;

double fx = XXX; // ratio coefficient to transform reading to force in x axis
double fy = XXX;

Joystick_x = fx*xReading;
Joystick_y = fy*yReading;

sendJoystickPos(Joystick_x,Joystick_y);// send data of joystick output
}
星羽 2008-02-26
  • 打赏
  • 举报
回复
机器2可以反馈消息给机器1吧?

你定义一个退出消息,当机器1把退出消息发送到机器2后,就处于等待状态

机器2受到退出消息,清理数据,如果给机器1反馈告诉机器1可以安全关闭了

arong1234 2008-02-26
  • 打赏
  • 举报
回复
你这些都是没有用得,平时能发送不代表sendJoystickPos在退出时也能发送。要看你用啥方法发送得,发送是否依赖于进程得某些资源状态等等
alongdawn 2008-02-26
  • 打赏
  • 举报
回复
我现在能确信的是:
在主程序体里,机器1是发送信号了,机器2也收到实时信号;
上面编写的代码是跟”Exit”按扭相连接的,函数sendJoystickPos(Joystick_x,Joystick_y)在主程序体里是可以发送信号的;
机器1按下”Exit”按扭以后,机器2表示力的变量仍然一直保持着非零值不变,这一值就是机器1按下”Exit”按扭之前所发送的最后一批值.
依我的判断,机器1在执行”Exit”退出程序时,并没有把零值发送出去,或者机器2没有接收到这些零值,可是为什么呢?是Sleep()的时间不够吗,还是其它什么原因呢?
arong1234 2008-02-26
  • 打赏
  • 举报
回复
首先要检查sendJoystickPos(Joystick_x,Joystick_y);
是不是同步的(异步的消息可能因为进程已经结束而丢掉)

改进方法不是通知,而是另外一个进程应该定时检测这个进程的存活性(如500ms检测一次)

消息发送总不能100%保证的,更何况这个进程还可能被异常中止呢?此时它根本不可能去发消息,所以,不要用通知
yisea123 2008-02-26
  • 打赏
  • 举报
回复
我要是你我会这样做

1)去掉EndDialog( hDlg, 0 );
看问题还在不在?

2)重复语句sendJoystickPos(Joystick_x,Joystick_y)多次
看问题还在不在?

3)把sleep改成一个for记数循环
看问题还在不在
alongdawn 2008-02-25
  • 打赏
  • 举报
回复
回复yisea123:
在程序正常运行时,机器1发送操纵杆实际输出的力值,机器2也确实能实时接收到这些力的值.现在的问题时,当在机器1的GUI里点击”Exit”按扭,其运行程序就要终止了,两机的通讯也应该终止了,可是机器2的表示力的变量里仍然保存着1刚终止时的非零值,所以受控的对象仍然继续运动,而且已经不受人的控制了(因为人机接口已经终止操作了嘛), 这是很危险的.我现在设想,在1的程序退出之前,执行一段代码,使得机器1将0作为力的值发送给机器2,这样以后控制对象运动的力就一直是0了.可是我上面的代码不能达到我的目的,请问这是怎么回事,怎么改进呢?谢谢!
BEYOND_Q 2008-02-25
  • 打赏
  • 举报
回复
进程间通信建议你用同步实现:如信号量啊,命名事件啊,等等吧.
yisea123 2008-02-25
  • 打赏
  • 举报
回复
这你得分析分析了
1)机器1是不是确实发送了?
2)机器2是不是接收到了东西?
3)接收到的是不是(0,0)?
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-02-25 04:42
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下