34 个解决方案
#1
先要用SetTimer,创建定时器...汗
#2
先要用SetTimer,创建定时器...汗
#3
先要用SetTimer,创建定时器...汗
#4
消息的优先级貌似是可以设置的。
#5
利用消息机制peekmessage来进行消息过滤。第一种我不想考虑,我想利用MFC的消息机制来解决这个问题,但是我不知道如何利用这个消息过滤方式,能否有高人指点,不知道我的问题表述清楚没有?急用!在线等!
=====================
没听说过这种方法,WM_TIMER消息的优先级低是无法改变的,PeekMessage可以利用线程的空闲时间进行工作,也许你说的是这个吧,一般的写法;
while(1)
{
if(PeekMessage(...)){
TransalteMessage(...);
DispatchMessage(...);
}
else{
OnTimer();}
}
=====================
没听说过这种方法,WM_TIMER消息的优先级低是无法改变的,PeekMessage可以利用线程的空闲时间进行工作,也许你说的是这个吧,一般的写法;
while(1)
{
if(PeekMessage(...)){
TransalteMessage(...);
DispatchMessage(...);
}
else{
OnTimer();}
}
#6
WM_TIMER消息的优先级低 基本都做完了才会响应 楼上正解
#7
其实就是用PeekMessage效果也不会有太大的差别,因为PeekMessage只是让你可以利用线程的空闲时间,而你的问题是处理别的消息的时间太长,导致WM_TIMER消息堵塞,所以真正解决的方法只能是多线程。或者在那个处理时间过长的消息处理语句里面用消息循环。
#8
用timeSetEvent,timeKillEvent,响应很及时的,用法可以查下CSDN
#9
用timeSetEvent,timeKillEvent,响应很及时的,用法可以查下MSDN
#10
ontimer是属于主线程里的东东,按道理是不会不响应的,除非你把主线程也堵塞了...
#11
为什么不考虑多线程呢?
#12
我是第一次来这个论坛,不知道如何按人来回复,只好一个一个来点名回复了。。
一楼:汗。。。我肯定先用了settimer函数。。。跟这个没有关系啦;
5楼:回答得有点那个意思,是否能写清楚点呢,比如说那个WHILE循环放到哪里写呢?
一楼:汗。。。我肯定先用了settimer函数。。。跟这个没有关系啦;
5楼:回答得有点那个意思,是否能写清楚点呢,比如说那个WHILE循环放到哪里写呢?
#13
您能否告诉我详细点呢?比如说这个消息循环写到哪呢?peekmessage函数里的参数是如何设置呢?本人一般只利用文档视图的结构写些小软件,很少涉及消息函数,希望您能多加指点!
#14
这几个函数我都用了,和settimer函数是一样的问题,现在我的问题不是精确地问题,而是当有其他要处理的消息时间很长时,ontimer函数和使用timeSetEvent利用回调函数一样不响应,呵呵,同样写些你哦~!
#15
不好说,因为我也不知道你的程序是啥样啊
另外,定时器这个东西不管怎么说都是基于消息的,你处理别的消息时间过长,不管怎么处理,定时器都会被堵,所以就像我上面说的, PeekMessage并不能改变你的代码情况。
要么开多线程,要么在你的别的消息处理函数中加GetMessage(&Msg,NULL,0,0);
我还是建议你用多线程吧
#16
据我现在的了解,多线程里对对话框以及文档视图结构参数的传递又是另一套机制,较多涉及消息的处理,我试着开了一个线程,但是好多函数的传参都变了,有点麻烦,所以我不想涉及这个,如果您能帮我实现这个也可以帮我指点,呵呵!就是利用定时器来控制进度条,让它不觉得死机,因为我处理的是一个很大的算法,运行起来要半个多小时,又不是简单的循环,是包含很多的算法过程,所以只好利用定时器来控制进度!
#17
据我现在的了解,多线程里对对话框以及文档视图结构参数的传递又是另一套机制,较多涉及消息的处理,我试着开了一个线程,但是好多函数的传参都变了,有点麻烦,所以我不想涉及这个,如果您能帮我实现这个也可以帮我指点,呵呵!就是利用定时器来控制进度条,让它不觉得死机,因为我处理的是一个很大的算法,运行起来要半个多小时,又不是简单的循环,是包含很多的算法过程,所以只好利用定时器来控制进度!
#18
因为我处理的是一个很大的算法,运行起来要半个多小时,又不是简单的循环,是包含很多的算法过程,所以只好利用定时器来控制进度!
===============
我仔细看了你的问题,发现你的想法是有问题的,不管是多线程还是定时器,用你的这种架构都不会及时更新进度条的。
正确的做法是将那个运行要半个多小时的算法放在线程中,否则是不行的。
===============
我仔细看了你的问题,发现你的想法是有问题的,不管是多线程还是定时器,用你的这种架构都不会及时更新进度条的。
正确的做法是将那个运行要半个多小时的算法放在线程中,否则是不行的。
#19
一般进度条的实时更新都要用到多线程么?是这个意思么?
#20
一个大的循环执行以后,控制权就在属于这个循环了,其他都执行不了了
需要让循环没执行一次就交出控制权,可以在循环中加入
MSG message;
while (::PeekMessage(&message, NULL, 0, PM_REMOVE)) {
::TranslateMessage(&message);
::DispatchMessage(&message);
}
如:
MSG message;
for(int i=1;i<10000;i++)
{
//循环执行的代码
if(::PeekMessage(&message, NULL, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
需要让循环没执行一次就交出控制权,可以在循环中加入
MSG message;
while (::PeekMessage(&message, NULL, 0, PM_REMOVE)) {
::TranslateMessage(&message);
::DispatchMessage(&message);
}
如:
MSG message;
for(int i=1;i<10000;i++)
{
//循环执行的代码
if(::PeekMessage(&message, NULL, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
#21
不是,应该是将你的要花很多时间的算法放在线程中,否则会堵住主线程。
#22
LS说的对,LZ你这种就应该把算法部分再开一个线程来做,不要放到界面线程里来做,然后用你的算法线程来通知界面线程刷新进度条,比如可以发送消息
#23
您说得我似乎有点明白了,只要在一个线程中,控制权即消息队列永远都属于这个大循环中,从消息队列中提取我需要的消息响应需要从这个循环中加入消息过滤,对吧?您是这个意思么?看来我不能在单线程里面使用进度条了,那么我想请教你,如何我的程序涉及很多的算法类,他们的循环是累加的,我如何来控制这个进度条的实时显示呢?您能否给我提一点其他的框架思路,我现在的进度条是与对话框绑在一起的!
#24
WM_TIMER的优先级比较低,只有当应用程序消息队列中没有其它待处理的消息的时候才回去响应它,所以延时很正常。。。
#25
BOOL CProgressBar_Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBEMDDoc* pdoc=(CBEMDDoc*)((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveDocument();//获得文档指针
m_ProCtrl.SetRange(0,100);
m_ProCtrl.SetPos(0);
m_ProCtrl.SetStep(10);
m_CtrlStatic.SetWindowText("数据加载中...........");
SetTimer(pdoc->nIDEvent,100,NULL);
return true;
}
void CProgressBar_Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int nPrePos=m_ProCtrl.StepIt();//取得更新前位置
CString text;
switch(nIDEvent)
{
case 1:m_CtrlStatic.SetWindowText("正在提取极值数据中.............");
break;
case 2:m_CtrlStatic.SetWindowText("正在拟合包络面中...............");
break;
case 3:m_CtrlStatic.SetWindowText("正在提取IMF中..................");
break;
default :KillTimer(nIDEvent);
}
CDialog::OnTimer(nIDEvent);
}
这是我放在单独一个对话框里的进度条与设计的计时器函数,在算法其他位置调用,Ontimer函数在执行其他算法时就怎么也进不去。另外,我用的是非模态对话框!不知道有人有更好的思路实现我这个想法么?多线程我暂时真不想去看,里面太多的消息通讯,好麻烦
{
CDialog::OnInitDialog();
CBEMDDoc* pdoc=(CBEMDDoc*)((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveDocument();//获得文档指针
m_ProCtrl.SetRange(0,100);
m_ProCtrl.SetPos(0);
m_ProCtrl.SetStep(10);
m_CtrlStatic.SetWindowText("数据加载中...........");
SetTimer(pdoc->nIDEvent,100,NULL);
return true;
}
void CProgressBar_Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int nPrePos=m_ProCtrl.StepIt();//取得更新前位置
CString text;
switch(nIDEvent)
{
case 1:m_CtrlStatic.SetWindowText("正在提取极值数据中.............");
break;
case 2:m_CtrlStatic.SetWindowText("正在拟合包络面中...............");
break;
case 3:m_CtrlStatic.SetWindowText("正在提取IMF中..................");
break;
default :KillTimer(nIDEvent);
}
CDialog::OnTimer(nIDEvent);
}
这是我放在单独一个对话框里的进度条与设计的计时器函数,在算法其他位置调用,Ontimer函数在执行其他算法时就怎么也进不去。另外,我用的是非模态对话框!不知道有人有更好的思路实现我这个想法么?多线程我暂时真不想去看,里面太多的消息通讯,好麻烦
#26
要想精确,可以使用线程
#27
都是多线程啊。。。
#28
如果是你调用的函数里面有一个很大的循环需要执行很长时间,而你又无法修改函数代码的时候,
程序会一直等你的函数返回结果,因为无法响应其他消息造成窗口无响应这种状态
这种情况下只有开一个线程来执行处理此函数的过程,这样窗口的消息才能不用等你的函数返回结果就能响应
#29
这是我放在单独一个对话框里的进度条与设计的计时器函数,在算法其他位置调用,Ontimer函数在执行其他算法时就怎么也进不去。另外,我用的是非模态对话框!不知道有人有更好的思路实现我这个想法么?多线程我暂时真不想去看,里面太多的消息通讯,好麻烦
==========================
不知道我上面的回复你看没看,如果你真不想用多线程,那么就在那个很大的循环中用GetMessage就行了。由于消息处理函数可以重入,所以可在大循环之中处理定时器。
==========================
不知道我上面的回复你看没看,如果你真不想用多线程,那么就在那个很大的循环中用GetMessage就行了。由于消息处理函数可以重入,所以可在大循环之中处理定时器。
#30
就是,为什么不考虑多线程呢
#31
您的回复我当然看了,我不是说过吗?我没有单独的大循环,如果仅此一个大循环,我当然会用啦,简单的和你这样说吧,加入我要实现一个分解过程,其中涉及求解大型线性方程组与大型的插值运算,这个分解过程的时间无疑是这两个算法的和,您说我能把定时器放到哪个循环中么?
#32
本人对多线程是一点都没有接触。。。
#33
大致评估两块计算代码的计算量,在中间插入若干个节点设置你的“进度”变量,再在主线程里访问该变量,置进度条相应位置
#34
大致评估两块计算代码的计算量,在中间插入若干个节点设置你的“进度”变量,再在主线程里访问该变量,置进度条相应位置
#1
先要用SetTimer,创建定时器...汗
#2
先要用SetTimer,创建定时器...汗
#3
先要用SetTimer,创建定时器...汗
#4
消息的优先级貌似是可以设置的。
#5
利用消息机制peekmessage来进行消息过滤。第一种我不想考虑,我想利用MFC的消息机制来解决这个问题,但是我不知道如何利用这个消息过滤方式,能否有高人指点,不知道我的问题表述清楚没有?急用!在线等!
=====================
没听说过这种方法,WM_TIMER消息的优先级低是无法改变的,PeekMessage可以利用线程的空闲时间进行工作,也许你说的是这个吧,一般的写法;
while(1)
{
if(PeekMessage(...)){
TransalteMessage(...);
DispatchMessage(...);
}
else{
OnTimer();}
}
=====================
没听说过这种方法,WM_TIMER消息的优先级低是无法改变的,PeekMessage可以利用线程的空闲时间进行工作,也许你说的是这个吧,一般的写法;
while(1)
{
if(PeekMessage(...)){
TransalteMessage(...);
DispatchMessage(...);
}
else{
OnTimer();}
}
#6
WM_TIMER消息的优先级低 基本都做完了才会响应 楼上正解
#7
其实就是用PeekMessage效果也不会有太大的差别,因为PeekMessage只是让你可以利用线程的空闲时间,而你的问题是处理别的消息的时间太长,导致WM_TIMER消息堵塞,所以真正解决的方法只能是多线程。或者在那个处理时间过长的消息处理语句里面用消息循环。
#8
用timeSetEvent,timeKillEvent,响应很及时的,用法可以查下CSDN
#9
用timeSetEvent,timeKillEvent,响应很及时的,用法可以查下MSDN
#10
ontimer是属于主线程里的东东,按道理是不会不响应的,除非你把主线程也堵塞了...
#11
为什么不考虑多线程呢?
#12
我是第一次来这个论坛,不知道如何按人来回复,只好一个一个来点名回复了。。
一楼:汗。。。我肯定先用了settimer函数。。。跟这个没有关系啦;
5楼:回答得有点那个意思,是否能写清楚点呢,比如说那个WHILE循环放到哪里写呢?
一楼:汗。。。我肯定先用了settimer函数。。。跟这个没有关系啦;
5楼:回答得有点那个意思,是否能写清楚点呢,比如说那个WHILE循环放到哪里写呢?
#13
您能否告诉我详细点呢?比如说这个消息循环写到哪呢?peekmessage函数里的参数是如何设置呢?本人一般只利用文档视图的结构写些小软件,很少涉及消息函数,希望您能多加指点!
#14
这几个函数我都用了,和settimer函数是一样的问题,现在我的问题不是精确地问题,而是当有其他要处理的消息时间很长时,ontimer函数和使用timeSetEvent利用回调函数一样不响应,呵呵,同样写些你哦~!
#15
不好说,因为我也不知道你的程序是啥样啊
另外,定时器这个东西不管怎么说都是基于消息的,你处理别的消息时间过长,不管怎么处理,定时器都会被堵,所以就像我上面说的, PeekMessage并不能改变你的代码情况。
要么开多线程,要么在你的别的消息处理函数中加GetMessage(&Msg,NULL,0,0);
我还是建议你用多线程吧
#16
据我现在的了解,多线程里对对话框以及文档视图结构参数的传递又是另一套机制,较多涉及消息的处理,我试着开了一个线程,但是好多函数的传参都变了,有点麻烦,所以我不想涉及这个,如果您能帮我实现这个也可以帮我指点,呵呵!就是利用定时器来控制进度条,让它不觉得死机,因为我处理的是一个很大的算法,运行起来要半个多小时,又不是简单的循环,是包含很多的算法过程,所以只好利用定时器来控制进度!
#17
据我现在的了解,多线程里对对话框以及文档视图结构参数的传递又是另一套机制,较多涉及消息的处理,我试着开了一个线程,但是好多函数的传参都变了,有点麻烦,所以我不想涉及这个,如果您能帮我实现这个也可以帮我指点,呵呵!就是利用定时器来控制进度条,让它不觉得死机,因为我处理的是一个很大的算法,运行起来要半个多小时,又不是简单的循环,是包含很多的算法过程,所以只好利用定时器来控制进度!
#18
因为我处理的是一个很大的算法,运行起来要半个多小时,又不是简单的循环,是包含很多的算法过程,所以只好利用定时器来控制进度!
===============
我仔细看了你的问题,发现你的想法是有问题的,不管是多线程还是定时器,用你的这种架构都不会及时更新进度条的。
正确的做法是将那个运行要半个多小时的算法放在线程中,否则是不行的。
===============
我仔细看了你的问题,发现你的想法是有问题的,不管是多线程还是定时器,用你的这种架构都不会及时更新进度条的。
正确的做法是将那个运行要半个多小时的算法放在线程中,否则是不行的。
#19
一般进度条的实时更新都要用到多线程么?是这个意思么?
#20
一个大的循环执行以后,控制权就在属于这个循环了,其他都执行不了了
需要让循环没执行一次就交出控制权,可以在循环中加入
MSG message;
while (::PeekMessage(&message, NULL, 0, PM_REMOVE)) {
::TranslateMessage(&message);
::DispatchMessage(&message);
}
如:
MSG message;
for(int i=1;i<10000;i++)
{
//循环执行的代码
if(::PeekMessage(&message, NULL, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
需要让循环没执行一次就交出控制权,可以在循环中加入
MSG message;
while (::PeekMessage(&message, NULL, 0, PM_REMOVE)) {
::TranslateMessage(&message);
::DispatchMessage(&message);
}
如:
MSG message;
for(int i=1;i<10000;i++)
{
//循环执行的代码
if(::PeekMessage(&message, NULL, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
#21
不是,应该是将你的要花很多时间的算法放在线程中,否则会堵住主线程。
#22
LS说的对,LZ你这种就应该把算法部分再开一个线程来做,不要放到界面线程里来做,然后用你的算法线程来通知界面线程刷新进度条,比如可以发送消息
#23
您说得我似乎有点明白了,只要在一个线程中,控制权即消息队列永远都属于这个大循环中,从消息队列中提取我需要的消息响应需要从这个循环中加入消息过滤,对吧?您是这个意思么?看来我不能在单线程里面使用进度条了,那么我想请教你,如何我的程序涉及很多的算法类,他们的循环是累加的,我如何来控制这个进度条的实时显示呢?您能否给我提一点其他的框架思路,我现在的进度条是与对话框绑在一起的!
#24
WM_TIMER的优先级比较低,只有当应用程序消息队列中没有其它待处理的消息的时候才回去响应它,所以延时很正常。。。
#25
BOOL CProgressBar_Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBEMDDoc* pdoc=(CBEMDDoc*)((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveDocument();//获得文档指针
m_ProCtrl.SetRange(0,100);
m_ProCtrl.SetPos(0);
m_ProCtrl.SetStep(10);
m_CtrlStatic.SetWindowText("数据加载中...........");
SetTimer(pdoc->nIDEvent,100,NULL);
return true;
}
void CProgressBar_Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int nPrePos=m_ProCtrl.StepIt();//取得更新前位置
CString text;
switch(nIDEvent)
{
case 1:m_CtrlStatic.SetWindowText("正在提取极值数据中.............");
break;
case 2:m_CtrlStatic.SetWindowText("正在拟合包络面中...............");
break;
case 3:m_CtrlStatic.SetWindowText("正在提取IMF中..................");
break;
default :KillTimer(nIDEvent);
}
CDialog::OnTimer(nIDEvent);
}
这是我放在单独一个对话框里的进度条与设计的计时器函数,在算法其他位置调用,Ontimer函数在执行其他算法时就怎么也进不去。另外,我用的是非模态对话框!不知道有人有更好的思路实现我这个想法么?多线程我暂时真不想去看,里面太多的消息通讯,好麻烦
{
CDialog::OnInitDialog();
CBEMDDoc* pdoc=(CBEMDDoc*)((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveDocument();//获得文档指针
m_ProCtrl.SetRange(0,100);
m_ProCtrl.SetPos(0);
m_ProCtrl.SetStep(10);
m_CtrlStatic.SetWindowText("数据加载中...........");
SetTimer(pdoc->nIDEvent,100,NULL);
return true;
}
void CProgressBar_Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int nPrePos=m_ProCtrl.StepIt();//取得更新前位置
CString text;
switch(nIDEvent)
{
case 1:m_CtrlStatic.SetWindowText("正在提取极值数据中.............");
break;
case 2:m_CtrlStatic.SetWindowText("正在拟合包络面中...............");
break;
case 3:m_CtrlStatic.SetWindowText("正在提取IMF中..................");
break;
default :KillTimer(nIDEvent);
}
CDialog::OnTimer(nIDEvent);
}
这是我放在单独一个对话框里的进度条与设计的计时器函数,在算法其他位置调用,Ontimer函数在执行其他算法时就怎么也进不去。另外,我用的是非模态对话框!不知道有人有更好的思路实现我这个想法么?多线程我暂时真不想去看,里面太多的消息通讯,好麻烦
#26
要想精确,可以使用线程
#27
都是多线程啊。。。
#28
如果是你调用的函数里面有一个很大的循环需要执行很长时间,而你又无法修改函数代码的时候,
程序会一直等你的函数返回结果,因为无法响应其他消息造成窗口无响应这种状态
这种情况下只有开一个线程来执行处理此函数的过程,这样窗口的消息才能不用等你的函数返回结果就能响应
#29
这是我放在单独一个对话框里的进度条与设计的计时器函数,在算法其他位置调用,Ontimer函数在执行其他算法时就怎么也进不去。另外,我用的是非模态对话框!不知道有人有更好的思路实现我这个想法么?多线程我暂时真不想去看,里面太多的消息通讯,好麻烦
==========================
不知道我上面的回复你看没看,如果你真不想用多线程,那么就在那个很大的循环中用GetMessage就行了。由于消息处理函数可以重入,所以可在大循环之中处理定时器。
==========================
不知道我上面的回复你看没看,如果你真不想用多线程,那么就在那个很大的循环中用GetMessage就行了。由于消息处理函数可以重入,所以可在大循环之中处理定时器。
#30
就是,为什么不考虑多线程呢
#31
您的回复我当然看了,我不是说过吗?我没有单独的大循环,如果仅此一个大循环,我当然会用啦,简单的和你这样说吧,加入我要实现一个分解过程,其中涉及求解大型线性方程组与大型的插值运算,这个分解过程的时间无疑是这两个算法的和,您说我能把定时器放到哪个循环中么?
#32
本人对多线程是一点都没有接触。。。
#33
大致评估两块计算代码的计算量,在中间插入若干个节点设置你的“进度”变量,再在主线程里访问该变量,置进度条相应位置
#34
大致评估两块计算代码的计算量,在中间插入若干个节点设置你的“进度”变量,再在主线程里访问该变量,置进度条相应位置