MFC的edit控件实时显示数据

xrqrenqiang 2017-02-28 11:32:50
我把自己的问题尽量说详细些。
首先,我设计了一个简单界面

工作流程是:点击“运行”按钮,这里我会启动另外一个工作者线程,这个线程会启动一个飞机飞行的动画演示,同时会得到飞机坐标的3个数组num1[1400]、num2[1400]、num3[1400]。
现在,我想在开始动画演示时,把这3个数组里的数据实时的显示在这3个edit控件中,实时显示飞机的位置。
按钮的响应函数程序如下:
void CVPTestDialogDlg::OnBnClickedbtrun()
{
// TODO: 在此添加控件通知处理程序代码
CWnd* pWnd=GetDlgItem(IDC_grScene);
myApp::CTS_RuningWindow=pWnd->GetSafeHwnd();
myApp::CTS_continueRunVP=true;
myApp::CTS_vegaThread=AfxBeginThread(myApp::CTS_RunBasicThread,this); //创建工作者线程,用它来启动vp主线程
char ch1[20];
for (int i=0;i<1430;i++)
{
sprintf(ch1,"%.2f",num1[i]);
SetDlgItemText(IDC_EDIT1,ch1);
}
}

上面我自己写的有错,请问应该怎么改?谢谢。


...全文
2911 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
博主你没写啊
东方still未明 2017-10-07
  • 打赏
  • 举报
回复
你好,我也在做这方面,可以交流一下吗QQ2446541820
向立天 2017-03-02
  • 打赏
  • 举报
回复
不是在线程里新建对话框 而是要把已有的对话框的句柄传给线程 否则消息就发错地方了
xrqrenqiang 2017-03-02
  • 打赏
  • 举报
回复
我会把我怎么解决这个问题的方法写在博客上的。
xrqrenqiang 2017-03-02
  • 打赏
  • 举报
回复
引用 6 楼 xrqrenqiang 的回复:
[quote=引用 4 楼 xianglitian 的回复:] [quote=引用 3 楼 xrqrenqiang 的回复:] [quote=引用 1 楼 xianglitian 的回复:] 在你的工作线程里 每切换一次绘制坐标就发一个自定义消息给主界面 消息的参数就是当前绘制的数组的索引 在消息函数里给编辑框赋值 关于自定义消息可参考 http://blog.csdn.net/qihailong123456/article/details/6777112
里面说道自定义类响应某个自定义的消息时,这个类必须都从CCmdTarget类中派生, 但我这里运行线程的这个类myApp继承于外部的,不属于MFC的,那应该怎么办?[/quote] 你的消息是发给对话框的,和工作线程无关[/quote] 恩恩,我按照说明把我自己的对话框的类CVPTestDialogDlg 进行了改写,其中头文件和源文件如下(进行了必要的简化以方便查看):
// VPTestDialogDlg.h : 头文件
//
#pragma once
#include "afxwin.h"

#define WM_MYMSG WM_USER+30	  //声明自定义消息

// CVPTestDialogDlg 对话框
class CVPTestDialogDlg : public CDialog
{
// 构造
public:
	CVPTestDialogDlg(CWnd* pParent = NULL);	// 标准构造函数
	virtual ~CVPTestDialogDlg();

// 对话框数据
	enum { IDD = IDD_VPTESTDIALOG_DIALOG };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持

// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	afx_msg LRESULT OnMyMsgHandler(WPARAM,LPARAM);	//定义自定义消息处理函数
	DECLARE_MESSAGE_MAP()
public:
        afx_msg void OnBnClickedbtrun();
};
// VPTestDialogDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "VPTestDialog.h"
#include "VPTestDialogDlg.h"
#include ".\vptestdialogdlg.h"
#include ".\publicmember.h"
#include "Blidaoyin.h"
#include "Kalman.h"
#include "CReadtxt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

// CVPTestDialogDlg 对话框

CVPTestDialogDlg::CVPTestDialogDlg()
{
	CWnd::Create(NULL,"VPTestDialogDlg",WS_CHILD,CRect(0,0,0,0),::AfxGetMainWnd(),1234);
}

CVPTestDialogDlg::CVPTestDialogDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CVPTestDialogDlg::IDD, pParent)
{
	CWnd::Create(NULL,"VPTestDialogDlg",WS_CHILD,CRect(0,0,0,0),pParent,1234);
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CVPTestDialogDlg::~CVPTestDialogDlg()
{
	CWnd::DestroyWindow();
}

BEGIN_MESSAGE_MAP(CVPTestDialogDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
        ON_BN_CLICKED(IDC_btRun, OnBnClickedbtrun)
	ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)		//实现自定义消息映射
END_MESSAGE_MAP()


// CVPTestDialogDlg 消息处理程序

//实现自定义消息处理函数
LRESULT CVPTestDialogDlg::OnMyMsgHandler(WPARAM w,LPARAM l)
{
	AfxMessageBox("Hello,World!");
	return 0; 
}

void CVPTestDialogDlg::OnBnClickedbtrun()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd=GetDlgItem(IDC_grScene);
	myApp::CTS_RuningWindow=pWnd->GetSafeHwnd();
	myApp::CTS_continueRunVP=true;
	myApp::CTS_vegaThread=AfxBeginThread(myApp::CTS_RunBasicThread,this);	//创建工作者线程,用它来启动vp主线程
}
然后在我那个线程所在的类中生成坐标值的代码后面添加上:
		CVPTestDialogDlg *test = new CVPTestDialogDlg();
		::SendMessage(test->m_hWnd,WM_MYMSG,0,0);
最终调试时显示如下错误: 这个IDD_VPTESTDIALOG_DIALOG是我对话框的ID。 请问这是怎么一回事?。[/quote]
引用 9 楼 xianglitian 的回复:
不是在线程里新建对话框 而是要把已有的对话框的句柄传给线程 否则消息就发错地方了
恩恩,现在大致问题解决了,只有个别小问题。非常感谢你能耐心给我讲解。谢谢。
赵4老师 2017-03-02
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
向立天 2017-03-01
  • 打赏
  • 举报
回复
引用 3 楼 xrqrenqiang 的回复:
[quote=引用 1 楼 xianglitian 的回复:] 在你的工作线程里 每切换一次绘制坐标就发一个自定义消息给主界面 消息的参数就是当前绘制的数组的索引 在消息函数里给编辑框赋值 关于自定义消息可参考 http://blog.csdn.net/qihailong123456/article/details/6777112
里面说道自定义类响应某个自定义的消息时,这个类必须都从CCmdTarget类中派生, 但我这里运行线程的这个类myApp继承于外部的,不属于MFC的,那应该怎么办?[/quote] 你的消息是发给对话框的,和工作线程无关
Eleven 2017-03-01
  • 打赏
  • 举报
回复
你工作线程可以发送自定义消息到UI线程,在UI线程的自定义消息响应函数中去更新编辑框的数据。
xrqrenqiang 2017-03-01
  • 打赏
  • 举报
回复
引用 4 楼 xianglitian 的回复:
[quote=引用 3 楼 xrqrenqiang 的回复:]
[quote=引用 1 楼 xianglitian 的回复:]
在你的工作线程里
每切换一次绘制坐标就发一个自定义消息给主界面
消息的参数就是当前绘制的数组的索引
在消息函数里给编辑框赋值
关于自定义消息可参考
http://blog.csdn.net/qihailong123456/article/details/6777112

里面说道自定义类响应某个自定义的消息时,这个类必须都从CCmdTarget类中派生,
但我这里运行线程的这个类myApp继承于外部的,不属于MFC的,那应该怎么办?[/quote]
你的消息是发给对话框的,和工作线程无关[/quote]
恩恩,我按照说明把我自己的对话框的类CVPTestDialogDlg 进行了改写,其中头文件和源文件如下(进行了必要的简化以方便查看):
// VPTestDialogDlg.h : 头文件
//
#pragma once
#include "afxwin.h"

#define WM_MYMSG WM_USER+30 //声明自定义消息

// CVPTestDialogDlg 对话框
class CVPTestDialogDlg : public CDialog
{
// 构造
public:
CVPTestDialogDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CVPTestDialogDlg();

// 对话框数据
enum { IDD = IDD_VPTESTDIALOG_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
HICON m_hIcon;

// 生成的消息映射函数
afx_msg LRESULT OnMyMsgHandler(WPARAM,LPARAM); //定义自定义消息处理函数
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedbtrun();
};


// VPTestDialogDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "VPTestDialog.h"
#include "VPTestDialogDlg.h"
#include ".\vptestdialogdlg.h"
#include ".\publicmember.h"
#include "Blidaoyin.h"
#include "Kalman.h"
#include "CReadtxt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

// CVPTestDialogDlg 对话框

CVPTestDialogDlg::CVPTestDialogDlg()
{
CWnd::Create(NULL,"VPTestDialogDlg",WS_CHILD,CRect(0,0,0,0),::AfxGetMainWnd(),1234);
}

CVPTestDialogDlg::CVPTestDialogDlg(CWnd* pParent /*=NULL*/)
: CDialog(CVPTestDialogDlg::IDD, pParent)
{
CWnd::Create(NULL,"VPTestDialogDlg",WS_CHILD,CRect(0,0,0,0),pParent,1234);
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CVPTestDialogDlg::~CVPTestDialogDlg()
{
CWnd::DestroyWindow();
}

BEGIN_MESSAGE_MAP(CVPTestDialogDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_btRun, OnBnClickedbtrun)
ON_MESSAGE(WM_MYMSG,OnMyMsgHandler) //实现自定义消息映射
END_MESSAGE_MAP()


// CVPTestDialogDlg 消息处理程序

//实现自定义消息处理函数
LRESULT CVPTestDialogDlg::OnMyMsgHandler(WPARAM w,LPARAM l)
{
AfxMessageBox("Hello,World!");
return 0;
}

void CVPTestDialogDlg::OnBnClickedbtrun()
{
// TODO: 在此添加控件通知处理程序代码
CWnd* pWnd=GetDlgItem(IDC_grScene);
myApp::CTS_RuningWindow=pWnd->GetSafeHwnd();
myApp::CTS_continueRunVP=true;
myApp::CTS_vegaThread=AfxBeginThread(myApp::CTS_RunBasicThread,this); //创建工作者线程,用它来启动vp主线程
}


然后在我那个线程所在的类中生成坐标值的代码后面添加上:
		CVPTestDialogDlg *test = new CVPTestDialogDlg();
::SendMessage(test->m_hWnd,WM_MYMSG,0,0);

最终调试时显示如下错误:

这个IDD_VPTESTDIALOG_DIALOG是我对话框的ID。
请问这是怎么一回事?网上似乎也没找到解决办法。
  • 打赏
  • 举报
回复
子线程取到数据了再通知UI去更新数据,你上面的代码不一定取到数据
worldy 2017-02-28
  • 打赏
  • 举报
回复
要清楚,每组数据产生的时间间隔,如果时间间隔太小是不必要的,系统也不一定更跟的上,一般100ms~500ms一组数据就很实时了
向立天 2017-02-28
  • 打赏
  • 举报
回复
在你的工作线程里 每切换一次绘制坐标就发一个自定义消息给主界面 消息的参数就是当前绘制的数组的索引 在消息函数里给编辑框赋值 关于自定义消息可参考 http://blog.csdn.net/qihailong123456/article/details/6777112
xrqrenqiang 2017-02-28
  • 打赏
  • 举报
回复
引用 1 楼 xianglitian 的回复:
在你的工作线程里 每切换一次绘制坐标就发一个自定义消息给主界面 消息的参数就是当前绘制的数组的索引 在消息函数里给编辑框赋值 关于自定义消息可参考 http://blog.csdn.net/qihailong123456/article/details/6777112
里面说道自定义类响应某个自定义的消息时,这个类必须都从CCmdTarget类中派生, 但我这里运行线程的这个类myApp继承于外部的,不属于MFC的,那应该怎么办?
一、VS2010/MFC编程入门教程之目录 第一部分:VS2010/MFC开发环境 VS2010/MFC编程入门之前言 VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解) 第二部分:VS2010/MFC应用程序框架 VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架) VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构) VS2010/MFC编程入门之四(MFC应用程序框架分析) VS2010/MFC编程入门之五(MFC消息映射机制概述) 第三部分:对话框 VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性) VS2010/MFC编程入门之七(对话框:为对话框添加控件) VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量) VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数) VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序) VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程) VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示) VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍) VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示) VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示) VS2010/MFC编程入门之十六(对话框:消息对话框) VS2010/MFC编程入门之十七(对话框:文件对话框) VS2010/MFC编程入门之十八(对话框:字体对话框) VS2010/MFC编程入门之十九(对话框:颜色对话框) 第四部分:常用控件 VS2010/MFC编程入门之二十(常用控件:静态文本框) VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control) VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box) VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例) VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox) VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box) VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar) VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上) VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下) VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上) VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下) VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上) VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下) 第五部分:菜单、工具栏与状态栏 VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解) VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用) VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类) VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用) VS2010/MFC编程入门之三十八(状态栏的使用详解) 第六部分:文档、视图和框架 VS2010/MFC编程入门之三十九(文档、视图和框架:概述) VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系) VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口) 第七部分:MFC常用类 VS2010/MFC编程入门之四十二(MFC常用类:CString类) VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类) VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer) VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类) VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理) 第八部分:字体和文本输出 VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类) VS2010/MFC编程入门之四十八(字体和文本输出:文本输出) 第九部分:图形图像 VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数) VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen) VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush) 第十部分:Ribbon界面开发 VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架) VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件) VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数) 本文来源于鸡啄米 http://www.jizhuomi.com/ , 原文地址:http://www.jizhuomi.com/software/257.html

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧