问题是这样的,程序中有一个按钮,点击此按钮,程序让编辑框A显示:“Programmer is programming!”,然后进行算法处理。算法处理OK后,编辑框A显示:“Programming is done.”
简单演示代码如下:
void CFRDlg::OnPorgress()
{
m_log.SetWindowText("Programmer is programming."); for(int i=0; i<100000000; i++){
}
m_log.SetWindowText("programming is done.");
}问题是,编辑框只能等到算法实现后才会显示:programming is done. 它不会显示:Programmer is programming。
我尝试过用消息等方式来处理,结果都不理想。请大家提供个能实现此功能的思路。A thousand thanks.
简单演示代码如下:
void CFRDlg::OnPorgress()
{
m_log.SetWindowText("Programmer is programming."); for(int i=0; i<100000000; i++){
}
m_log.SetWindowText("programming is done.");
}问题是,编辑框只能等到算法实现后才会显示:programming is done. 它不会显示:Programmer is programming。
我尝试过用消息等方式来处理,结果都不理想。请大家提供个能实现此功能的思路。A thousand thanks.
此方法,我昨天试过了,还是不行,代码如下:
void CFRDlg::OnProgramming()
{
SendMessage(WM_MYMSG,0,0);
m_x=m_x+1;
m_z=m_z+1;
UpdateData(FALSE);
}void CFRDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
SetDlgItemText(IDC_LOG,"FR is programming...");
UpdateData(FALSE);
for(int i=0; i<1000000000000; i++){
}
m_log.SetWindowText("programming is done.");
}请问是我代码写的有问题?还是思路不对? 请指教,谢谢!
}
放入线程里,然后在循环结束了,在发消息,处理 m_log.SetWindowText("programming is done.");
先声明消息响应函数:CMyClass.h文件 定义#define WM_MYUPDATEEDIT WM_USER+1001, LRESULT OnUpdateEdit(WPARAM wParam, LPARAM lParam).CMyClass.cpp文件,MFC 的消息响应BEGIN_MESSAGE_MAP中增加ON_MESSAGE(WM_MYUPDATEEDIT, OnUpdateEdit), 消息函数实现:
LRESULT CMyClass:OnUpdateMyEdit(WAPRAM wParam, LPARAM lParam)
{
int nState = (int)wParam;
if(nState == 0)
GetDlgItem(IDC_LOG)->SetWindowText("FR is programming...");
if(nState == 1)
GetDlgItem(IDC_LOG)->SetWindowText("programming is done.");}
void CFRDlg::OnProgramming()
{
AfxBeginThread(MyProgrammingThread, this);
}//线程函数
UINT MyProgrammingThread(LPVOID lpVoid)
{ CMyClass *pMyClass = (CMyClass*)lpVoid;
pMyClass->PostMessage(WM_MYUPDATEEDIT, 0, 0);
for(int i=0; i <100000000; i++){ }
pMyClass->PostMessage(WM_MYUPDATEEDIT, 1, 0);
}
请您说清楚点,我自己试过类似您说的方法,但是达不到我要的要求。演示代码如下:void CFRDlg::Test1()
{
m_log.SetWindowText("Programmer is programming.");
}void CFRDlg::Test2()
{
m_log.SetWindowText("programming is done.");
}void CFRDlg::OnPorgress()
{
Test1();
for(int i=0; i <100000000; i++){
}
Test2();
} 请问,您是指的这个方式吗?但是我试过不行。
m_dfdf.SetFocus();//少了这句不行
Sleep(1000);
m_log.SetWindowText("programming is done."); 勉强行,我也搞不清怎么回事
谢谢,这是最简单的方式。
将m_log,SetWidnowText(),置前Sleep就可以不要了。m_log..SetWindowText("Programmer is programming.");
m_log.SetFocus();
for(int i=0; i <100000000; i++)
{
}
m_log.SetWindowText("programming is done."); Thanks a lot.
界面上面应该快速响应你的计算结果,而不是为了显示一个状态字符串而挂起1秒钟。这样子,你的界面会给人一种反映迟钝的感觉。把大量计算给worker线程,线程和界面之间采用消息传递,这样子你的线程会给人一种反应非常灵敏的感觉。