首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

MFC 用户界面线程传送大量数据到主线程

2013-09-17 
MFC 用户界面线程传递大量数据到主线程我需要从txt文档读取大量测量数据到程序处理和显示,如果都在主线程

MFC 用户界面线程传递大量数据到主线程
    我需要从txt文档读取大量测量数据到程序处理和显示,如果都在主线程实现,程序界面在读数和处理的时候界面就出现假死。觉得很不舒服。
    现在我采用用户界面线程,主线程启动子线程后,在子线程完成txt数据读取,然后将数据传递到主线程显示。

   现在问题是,数据量很大,怎么从子线程传递到主线程呢?
   看网上说公共变量可以,但是不建议用。。。。
   MFC传递指针又不允许。。。。。
   应该怎样才能传递呢?请大家帮帮忙。最好有具体详细点的代码示例。谢谢啦
MFC 用户界面线程 数据传递
[解决办法]
1. 子线程把要传递的内容写入文件或注册表
2. 子线程向主线程发消息,比如自定义消息 
3. 主线程在自定义消息回调中读文件或注册表
[解决办法]
怎么不允许传递指针呢? 后台程序读取,开辟空间,填入消息,将空间起始地址作为消息参数发给UI对话框,UI显示后删除空间。。

[解决办法]

引用:
我现在这么做的:

float* pTxtDate; 
pTxtDate=new float[mTotalOpenNum];
//mTotalOpenNum是要读取数据的总数
.....
.....
//将数据都读取到pTxtDate后
PostMessage(GetMainWnd()->m_hWnd,WM_MYMESSAGE,(WPARAM)pTxtDate,0);
];

这样的话我能够紧跟着delete [] pTxtDate;吗?
还有在我的消息函数中:

CString str;
str.Format("%.2f",wParam);

怎么没有传过来数据呢?

请大家帮我看看,谢谢!


思路没错,写法上楼主搞错了。
直接开个char数组读取,读完后发消息(数组指针,内容长度),窗口里收到消息后,直接赋值给CString就可以了。
[解决办法]
str.Format("%.2f",wParam);---->仅仅是打印了wParam本身的地址,而不是它所指向的内存内容。
[解决办法]
float* pTxtDate; 
-->是从文本文件中加载内容,那么内容应该当作字符串来处理,即使内容是一些浮点数,此时也是字符串表达方式,所以不用float来保存文本文件内容,用char *更合适一些,当然用void *也行,只要有内存来保存内容即可。
[解决办法]
用一个结构体全局变量,里面开一个buffer,作保存数据的地方,

线程之间传结构体的地址,是安全的,因为这个结构体不是MFC中自带的,只要你自己负责线程安全就可以了
[解决办法]
引用:
Quote: 引用:

用一个结构体全局变量,里面开一个buffer,作保存数据的地方,

线程之间传结构体的地址,是安全的,因为这个结构体不是MFC中自带的,只要你自己负责线程安全就可以了



你好,我想问下,我在线程中定义了
struct sTxtData
{
CString strDate;
CString strTime;
float mValue;
};
sTxtData* myData;

然后每次我读上来的数据都赋给
myData->strDate=strToShow;
myData->strTime=strToShow;
myData->mValue=atof(strToShow);
后,我再发消息:
SendMessage(GetMainWnd()->m_hWnd,WM_MYMESSAGE,WPARAM(myData),0);
问题1:这样发消息对吗?
问题2:在主线程的消息函数中我该怎样接收呢?
谢谢啦,我基础不行。


如果你用 SendMessage,那这样写代码是可以的:发送线程不需要new,接收线程也不需要delete,比较简单。
接收线程使用强制转换 (sTxtData*)myData

但是,使用SendMessage的话,会使得接收线程在没有处理完WM_MYMESSAGE消息之前,发送线程会一直等待。
如果程序运行速度正常,那就使用SendMessage。

如果觉得程序运行速度不理想,可以改用PostMessage,或者WM_COPYDATA消息。
[解决办法]
引用:
Quote: 引用:

用一个结构体全局变量,里面开一个buffer,作保存数据的地方,

线程之间传结构体的地址,是安全的,因为这个结构体不是MFC中自带的,只要你自己负责线程安全就可以了


你好,我想问下,我在线程中定义了
struct sTxtData
{
CString strDate;
CString strTime;
float mValue;
};
sTxtData* myData;

然后每次我读上来的数据都赋给
myData->strDate=strToShow;
myData->strTime=strToShow;
myData->mValue=atof(strToShow);
后,我再发消息:
SendMessage(GetMainWnd()->m_hWnd,WM_MYMESSAGE,WPARAM(myData),0);
问题1:这样发消息对吗?
问题2:在主线程的消息函数中我该怎样接收呢?
谢谢啦,我基础不行。


1.这么发送时可以的
2.在处理线程那边做个消息映射
BEGIN_MESSAGE_MAP(CDlgRightView, CDialog)
    ON_MESSAGE(WM_MYMESSAGE,M_ProcFun)//M_ProcFun是你的处理函数 
END_MESSAGE_MAP()
M_ProcFun函数中定义myData的对象 mydata
memcpy( &mydata, (myData)wParam, sizeof(myData) );
直接拷贝 取出数据就是了
[解决办法]
 MFC传递指针又不允许。。。。。

你确定说的是线程,不是进程么?

怎么不能传了?WM_COPYDATA是跨进程的。
[解决办法]
我自己是这么使用的
发送时myData用对象
SendMessage(GetMainWnd()->m_hWnd,WM_MYMESSAGE,(WPARAM)(&myData),0);
拷贝时就能直接拷贝对象内存地址

热点排行