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);
}
}

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


...全文
3049 13 打赏 收藏 转发到动态 举报
写回复
用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的,那应该怎么办?

15,976

社区成员

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

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