我需要从txt文档读取大量测量数据到程序处理和显示,如果都在主线程实现,程序界面在读数和处理的时候界面就出现假死。觉得很不舒服。
现在我采用用户界面线程,主线程启动子线程后,在子线程完成txt数据读取,然后将数据传递到主线程显示。 现在问题是,数据量很大,怎么从子线程传递到主线程呢?
看网上说公共变量可以,但是不建议用。
MFC传递指针又不允许。。
应该怎样才能传递呢?请大家帮帮忙。最好有具体详细点的代码示例。谢谢啦
MFC用户界面线程数据传递
现在我采用用户界面线程,主线程启动子线程后,在子线程完成txt数据读取,然后将数据传递到主线程显示。 现在问题是,数据量很大,怎么从子线程传递到主线程呢?
看网上说公共变量可以,但是不建议用。
MFC传递指针又不允许。。
应该怎样才能传递呢?请大家帮帮忙。最好有具体详细点的代码示例。谢谢啦
MFC用户界面线程数据传递
解决方案 »
- 如何在VC程序中添加背景音乐,但是其他按键声音播放对背景音乐无影响???
- VS2008中如何设置菜单快捷键?
- 求windows核心编程 电子书中文版的下载网址,找了半天都没找到,郁闷ing!!!!!!!!!!
- 关于类封装的问题!
- 一个简单的问题但十分有用的问题
- 纯c怎样调用activex?恳请赐教!
- 怎样可以将DLL编译到EXE文件里
- 看书看不明白的地方,谁能解释一下,能让我还能对学习VC有点信心?
- 记得以前见过通过命令来进行局域网聊天,那位大虾知道是怎么做的。。
- 我想把一个用3dmax做的模型,导入openGL中,该如何处理?有现成的工具吗?
- 求助:有什么办法在调用图片前就给该图片处理么?
- vc2010+MFC对话框
我就是觉得在主线程读txt文档数据有假死的现象,所以让子线程读。
如果子线程读完存到文件,再主线程读。哪还不如主线程直接读呢?
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就可以了。
-->是从文本文件中加载内容,那么内容应该当作字符串来处理,即使内容是一些浮点数,此时也是字符串表达方式,所以不用float来保存文本文件内容,用char *更合适一些,当然用void *也行,只要有内存来保存内容即可。
你好,我想问下,我在线程中定义了
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:在主线程的消息函数中我该怎样接收呢?
谢谢啦,我基础不行。
大家帮我出出注意啦!!!!!!!
你好,我想问下,我在线程中定义了
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消息。
你好,我想问下,我在线程中定义了
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) );
直接拷贝 取出数据就是了
你好,我想问下,我在线程中定义了
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) );
直接拷贝 取出数据就是了
memcpy( &mydata, (myData)wParam, sizeof(myData) );
这一句报错cannot convert from 'unsigned int' to 'struct sTxtData'
什么情况呢?
发送时myData用对象
SendMessage(GetMainWnd()->m_hWnd,WM_MYMESSAGE,(WPARAM)(&myData),0);
拷贝时就能直接拷贝对象内存地址
真心话,像我们这样半道出家的,真的需要好好学习MSDN上的实例。最后解决办法也是MSDN的实例。
第一步:定义结构体(在头文件中)#pragma pack(1)
struct sTxtData
{
CString strDate;
CString strTime;
CString strValue;
};
#pragma pack;定义结构体对象和COPYDATASTRUCT对象sTxtData* pData=new sTxtData();
COPYDATASTRUCT cpdsTruct;将每行从txt文档读来的数据赋给pData的对应变量:
pData->strDate=strToShow;
pData->strTime=strToShow;
pData->strValue=strToShow;
然后将结构体信息赋给消息准备传递的cpdsTruct
cpdsTruct.dwData=0;
cpdsTruct.cbData=sizeof(sTxtData);
cpdsTruct.lpData=(PVOID)pData;
然后发送消息WM_COPYDATA
SendMessage(GetMainWnd()->m_hWnd,WM_COPYDATA,NULL,(LPARAM)&cpdsTruct);第二步:重载WM_COPYDATA消息
然后在BOOL ***::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
中添加:
CString mDate,mTime,mValue;
sTxtData* myRData=(sTxtData*)(pCopyDataStruct->lpData);
mDate=myRData->strDate;
mTime=myRData->strTime;
mValue=myRData->strValue;至此,利用界面线程打开txt文件中一行数据就都传递到主线程了。
提醒:没有安装MSDN的孩纸们,赶紧安装。没有那玩意,痛苦着呢……………………