希望各位帮帮我,我力求言简意赅。主要的问题是在程序运行过程中界面上的控件不可控(如菜单、按钮)问题简述如下:我原先有一个console程序,需要改为MFC程序,主要是为了通过UI来监控程序进程和暂停/继续程序。我首先不考虑“暂停”功能,通过界面实现了对信息数据的显示;
然后考虑添加“暂停”功能。通过在CSDN发帖被告知将那个主函数放入一线程即可。于是我在原先的“run按钮”的消息处理函数创建了线程CMainFrame::OnRun()
{
thread = AfxBeginThread(run, this);
}UINT CMainFrame::run(LPVOID p)
{
CMainFrame * me = (CMainFrame *)p;
me->run();
return 0;
}
void CMainFrame::run()
{
SendMessage(WM_UPDATEDISPLAY);
}其中的WM_UPDATEDISPLAY是我自定义的:如下
#define WM_UPDATEDISPLAY WM_USER + 101消息映射
ON_MESSAGE_VOID(WM_UPDATEDISPLAY, UpdateDisplay)afx_msg void UpdateDisplay(); //类消息函数
void CMainFrame::UpdateDisplay()
{
//★★★★★★★★★★★★★★★★★★
// 我把程序的主函数放在这里
// 其中包括所有的运算以及数值显示在各View当中
//★★★★★★★★★★★★★★★★★★
}这个问题困扰我一整天了。从早7;00-晚23:30.
希望明早开机看此帖时会得到好心人的帮助。
小弟先谢了!!!
然后考虑添加“暂停”功能。通过在CSDN发帖被告知将那个主函数放入一线程即可。于是我在原先的“run按钮”的消息处理函数创建了线程CMainFrame::OnRun()
{
thread = AfxBeginThread(run, this);
}UINT CMainFrame::run(LPVOID p)
{
CMainFrame * me = (CMainFrame *)p;
me->run();
return 0;
}
void CMainFrame::run()
{
SendMessage(WM_UPDATEDISPLAY);
}其中的WM_UPDATEDISPLAY是我自定义的:如下
#define WM_UPDATEDISPLAY WM_USER + 101消息映射
ON_MESSAGE_VOID(WM_UPDATEDISPLAY, UpdateDisplay)afx_msg void UpdateDisplay(); //类消息函数
void CMainFrame::UpdateDisplay()
{
//★★★★★★★★★★★★★★★★★★
// 我把程序的主函数放在这里
// 其中包括所有的运算以及数值显示在各View当中
//★★★★★★★★★★★★★★★★★★
}这个问题困扰我一整天了。从早7;00-晚23:30.
希望明早开机看此帖时会得到好心人的帮助。
小弟先谢了!!!
{
CMainFrame *pWnd = (CMainFrame*)lpParam;
..... // 执行所有的运算以及数值显示在各View当中
}void CMainFrame::OnRun()
{
thread = AfxBeginThread(UpdateDisplay, this);
}
你的方法我试过了,可是问题依旧。不过还是谢谢你。
To: Mackz(在相互) ( ★★)
感谢你的建议,可是我不知道该如何改正。
如下这篇文章描述的正是我的问题:试图在worker thread当中修改UI。希望各位看看。谢谢http://www.codeproject.com/threads/usingworkerthreads.asp
【Worker threads and the GUI II: Don't touch the GUI】
{
CMainFrame *pWnd = (CMainFrame*)lpParam; pWnd->PostMessage(WM_UPDATEDISPLAY); // 试试这个
// 我没试,不行别打我~&
}void CMainFrame::OnRun()
{
thread = AfxBeginThread(Run, this);
}
{
//SendMessage(WM_UPDATEDISPLAY);
//此处不要给自己发消息,而是给view发消息
}其中的WM_UPDATEDISPLAY是我自定义的:如下
#define WM_UPDATEDISPLAY WM_USER + 101消息映射
ON_MESSAGE_VOID(WM_UPDATEDISPLAY, UpdateDisplay)afx_msg void UpdateDisplay(); //类消息函数
void CxxxView::UpdateDisplay()
{
//★★★★★★★★★★★★★★★★★★
// 我把程序的主函数放在这里
// 其中包括所有的运算以及数值显示在各View当中
//★★★★★★★★★★★★★★★★★★
}//试一试看行不行
还有,就是你在你的UpdateDisplay里弄个断点,看在你发消息的时候,是否有运行这个函数,如果没有,那肯定是不行的
void CMainFrame::run()
{
//SendMessage(WM_UPDATEDISPLAY);
//此处不要给自己发消息,而是给view发消息
}
我这里是对多个View以及status bar中的信息进行修改,怎么给所有的这些UI控件同时发消息UpdateDisplay不用设置断点,肯定运行了。
因为我现在的问题是:各个view都可以更新,但是主窗口中的菜单和按钮不能人为控制。
UINT UpdateDisplay(LPVOID lpParam)
{
CMainFrame *pWnd = (CMainFrame*)lpParam;
..... // 执行所有的运算以及数值显示在各View当中
}void CMainFrame::OnRun()
{
thread = AfxBeginThread(UpdateDisplay, this);
}
一定可以,我都试过去了
楼主,如果你还试不出来的话,留下个email,给你一个demo,就是按照 hab1980(秋艮)的方法
做的
因为我现在的问题是:各个view都可以更新,但是主窗口中的菜单和按钮不能人为控制。
--------------------------------------------------------------------------------
哎呀,真是的,把问题说清楚点嘛,看上边的回答,都不是你想要的嘛
“不能人为控制”是什么意思?
非常感谢大家的帮助。另外,我说的“不能人为控制”的意思是:
在程序运行过程中,下拉菜单和按钮不能响应鼠标。
如:一个数从1增至10000000
在递增过程中,按钮不能按。
只有当递增完毕后才可以。
而我希望在递增过程中的每时每刻都可以对其进行操作。谢谢大家了。
{
// 你应该把程序的主函数放在这里
//仅在需要更新界面时调用SendMessage(WM_UPDATEDISPLAY);
//example
while (1)
{
if (some_reason_cause_thread_exit)
{
break;
}
else
{
//do your job
//and then update display
SendMessage(WM_UPDATEDISPLAY);
}
}
}void CMainFrame::UpdateDisplay()
{
UpdateWindow();
Invalidate();
}
{
//★★★★★★★★★★★★★★★★★★
// 我把程序的主函数放在这里
// 其中包括所有的运算以及数值显示在各View当中
//★★★★★★★★★★★★★★★★★★
}UpdateDisplay()是在主线程中执行的,这样也可已,但是你必须在其中自己建立消息循环处理消息,否则当然无法响应界面了,因该程序的主线程就是界面线程
注意:线程函数一定要定义成全局函数,或者静态函数.推荐使用全局函数.!!!!!!!!!!!!!
消息函数中的参数如何赋值呢?
只需要把界面更新的部分放到主线程去执行
----------------------------------------
我的问题是:
我的所有程序全部封装在MyProg::Run()当中了,其中包括对各view显示界面的刷新。
无法拆分,怎么办???
它的结构是这样的。for(int i=0;i<1000000;i++)
{
// 进行复杂的运算
// 存于各个object当中
// ......
// 对UI界面进行刷新
}整个程序的运作方式如下:1. 点击“开始”按钮
2. 进入“Run()”的循环当中
3. 循环结束,程序结束。
它上面讲了手动操作UPDATE_COMMAND_UI
不妨看看
太长了,一下子也讲不清楚May you succeed!
看了看目录,没有发现关于线程的问答:(即将在郁闷中死去......
{
CreateThread(... ThreadFunc ,this...);
}CALLBACK ThreadFunc()
{
for(int i=0;i<1000000;i++)
{
this->UpdateData();
}
}
{ for(int i=0;i<1000000;i++)
{
// 进行复杂的运算
// 存于各个object当中
// ......
SendMessage(WM_UPDATEDISPLAY); //此句对UI界面进行刷新
}}void CMainFrame::UpdateDisplay()
{
UpdateWindow();
Invalidate();
//还可以加入你的其他更新要求
}
谢谢大家的耐心解答,尤其是 ukyoking(累) (★★★★★)
我是按照您的方法解决问题的。致礼! ukyoking(累) (★★★★★)
致礼! CSDN的良好氛围!!!!!!
谢谢大家的耐心解答,尤其是 ukyoking(累) (★★★★★)
我是按照您的方法解决问题的。致礼! ukyoking(累) (★★★★★)
致礼! CSDN的良好氛围!!!!!!