请教,关于主程序界面和各模块之间的数据交换

严黎斌 2004-09-28 09:29:13
我要编个软件,总的说比较简单,主界面接受一些参数,然后调用一个模块,进行繁复的运算,最后算出结果,显示回主界面。这个计算模块运算量很大,但逻辑上与界面联系不大,所以我将其独立成一个cpp文件。但模块在运算中,需要将一些进度信息、中间结果显示到界面,最后是计算结果显示到界面。这些信息就是些文本,比如CString就可以,然后在一个文本框中显示出来。
现在的问题是,我如何让模块的这些信息及时反应到界面中?我现在仅能做到全部结果完成后,才将所有结果返回界面并显示。而在比较长的运算中,界面就象失去反应一样。我现在需要计算模块实时地将中间状态显示到界面上,但不知道有什么好的方法来实现?
我遇到的主要困难是,如何让模块返回信息到主界面?模块中无法访问界面的窗口类的成员变量或函数呀。想做成类似回调函数的,但类中的成员函数我不知如何转换成普通的静态函数。
还有,如何能让界面信息刷新和模块的运算两不误?是不是要用线程?
罗哩罗嗦一大堆,希望大家能看明白。当然,这些问题对vc老手来说可能就很简单啦。
...全文
239 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mega1212 2004-09-30
  • 打赏
  • 举报
回复
看来楼主是牛人
严黎斌 2004-09-30
  • 打赏
  • 举报
回复
谢谢各位指点。
我现在已经完成了消息机制,就是用消息来向主界面传递信息。自定义消息也可以了,但因为要传递字符信息,所以主要使用了WM_SETTEXT消息。
下一步,就是再改造成在新线程中工作,呵呵。

另外,大家对我的中文id感兴趣?这不关我的事儿呀,csdn他们帮我做的id,然后拉我过来了 ;)
alon21 2004-09-30
  • 打赏
  • 举报
回复
搂主的ID怎么是中文的?
NOldkiller 2004-09-30
  • 打赏
  • 举报
回复
class CMainFrame::CFrameWnd
{
//...
static UINT CalcThread(LPVOID lpVoid);
void DisplayCalcResult(LPCTSTR lpszMsg);
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpcs)
{
if(-1==CFrameWnd::OnCreate(lpcs))
{
return -1;
}
//...
AfxBeginThread(CalcThreadProc,(LPVOID)this);
}

UINT CMainFrame::CalcThreadProc(LPVOID lpVoid)
{
CMainFrame* pMainFrame = static_cast<CMainFrame*>(lpVoid);
TCHAR szBuf[256];
for(int i=0;i<5000;i++)
{
::_snprintf(szBuf,sizeof(szBuf),_T("%d"),i);
pMainFrame->DisplayCalcResult(szBuf);
}

return 0;
}
fupinger 2004-09-30
  • 打赏
  • 举报
回复
Give me your Mail,I'll write to you ,there will be a DEMO in my letters.I have done a Progrom like this ,i think ,that is you want.

My Progrom Works like this:had a Main Dialog,and a worker_thread worked for download some data from internet.when i done it without thread,had the same problem with you...right now it sames very good.
严黎斌 2004-09-30
  • 打赏
  • 举报
回复
好了,线程也做好了。
现在基本上符合我的设计意图了,信息交换正常,界面也不象死机一样了。
多谢大家的指导。以后还要多请教呀。
结贴。
严黎斌 2004-09-29
  • 打赏
  • 举报
回复
谢谢指教。
我也倾向于认为创建线程比较好,这能明显改善程序界面响应和操作性。
那么还有个问题就是,在线程中,如何将当前的运行状态反馈给主界面?其他模块中我不能直接访问那些窗口元素比如文本框之类的。我想知道有没有比较常规的、通用的做法?(我是vc新手,呵呵)因为很多软件的编写中都会遇到这样的情形。它们是如何处理的?
oygy 2004-09-29
  • 打赏
  • 举报
回复
有两种解决方案:
1,第一种是在主线程中开一个WORKER线程,将大时空运算放在其中,通过AfxBeginThread中的参数变量在主辅线程之间传递信息,在主界面线程上显示进度;
2,另外一种是在主线程中开一个UI线程,将大时空运算及进度显示均放在这个UI线程中,有点类似于非模态.
Flood1984 2004-09-29
  • 打赏
  • 举报
回复
自定义一个消息,向主界面发送消息
我是这样做的
kugou123 2004-09-29
  • 打赏
  • 举报
回复
早期CSDN是可以注册中文的,现在可能不行了。
快乐鹦鹉 2004-09-29
  • 打赏
  • 举报
回复
也请教,中文名是怎么弄出来的????
dirdirdir3 2004-09-29
  • 打赏
  • 举报
回复
是要通过建立一个新的线程,再自己定义一个消息,通过消息把信息传输给主界面。
roger_ding 2004-09-29
  • 打赏
  • 举报
回复
把运算部分放到单独的线程中
主程序显示一个模态对话框(可以有“取消”),里面有个进度条
运算线程通过给进度条发消息,来显示进度
mfmmfc 2004-09-29
  • 打赏
  • 举报
回复
1.自定义一个消息,向主界面发送消息,在处理
2.类的成员函数也可以是回调函数,前加static即可
clack234 2004-09-29
  • 打赏
  • 举报
回复
应该是用工作线程!!
nwpulipeng 2004-09-29
  • 打赏
  • 举报
回复
混分帮顶
  • 打赏
  • 举报
回复
创建一个工作线程
kugou123 2004-09-28
  • 打赏
  • 举报
回复
建立一个线程,专门负责运算。这样界面就不会没反映了。
然后在线程中,实时用FindWindow和SetWindowText,就可以动态改变主界面的文本框中的信息。

15,979

社区成员

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

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