vc程序窗口最小化出现的奇怪现象,急求解答

musdenis 2009-11-01 12:37:04
各位牛人,首先我想问:为什么我的程序窗口用右上角的最小化按钮和用任务栏图标最小化效果不一样。它们都能实现窗口最小化,这时对的,但是还原后效果不一样。具体如下:
我的程序分两线程,一个是在读数据,简单来说就是读TXT中的数据,然后读完一组1280个数据,我就要将数据在另一个线程中进行数据处理,然后进行画图。在读数据的线程中,在读完一组数据后我用while(!m_finished) sleep(5);等待一次画图完成然后读入第二组数据。变量在读完一组数据后被置为FALSE,在画图结束后被置为TRUE,画图是在CDrawView类中的OnDraw()中完成的,在数据处理结束后由Invalidate(False)触发其执行。但是我发现在窗口最小化情况下OnDraw()函数是不执行的,这时为什么?
如果不执行OnDraw()的话,m_finished就无法被置为TRUE,这样数据读取进程就一直处于等待状态,新的数据进不来。我的程序要求在最小化情况下还是得读入数据的,所以我就想象着分两种情况,如果没有最小化,就按之前的来做;如果最小化,就干脆在数据处理完之后就将m_finished置为TRUE,继续读下一组数据。
刚开始我考虑在数据处理的结尾加上如下代码:
if(m_minimize) //m_minimize用于判断是否最小化
m_finished=TRUE;
else
Invalidate(FALSE);

然后m_minimize是在CMainFrame中的OnSysCommand(UINT nID, LPARAM lParam)中添加如下代码:
switch(nID)
{
case SC_MINIMIZE:
pDrawView->m_minimize=TRUE; //pDrawView是指向CDrawView类的指针
ShowWindow(SW_MINIMIZE);
break;
case SC_RESTORE:
pDrawView->m_minimize=FALSE;
ShowWindow(SW_RESTORE);
break;
default:
默认代码。。。
break;
}
但是调试过程中,发现最小化或还原可以执行OnSysCommand中的代码,pDrawView->m_minimize也看着被修改了,但是CDrawView中的minimize确没有变,导致最小化时数据还是读不进来, if(m_minimize) //m_minimize用于判断是否最小化
m_finished=TRUE; 这句代码不执行,最小化了为什么还不执行啊?

于是我用第二种想法:在CDrawView类数据处理结束后加上如下代码:
HWND hwnd=pMain->GetSaveHwnd(); //pMain是指向CMainFrame类的指针
CWindow mywindow;
mywindow.Attach(hwnd);
if(mywindow.IsInconic())
m_minimize=TRUE;
else
Invalidate(FALSE);

发现在这种情况下出现了奇怪的现象:如果我点击任务栏的图标最小化,发现可以执行if(mywindow.IsInconic())
m_minimize=TRUE; 自然数据在最小化是也会读入,还原后可以新进来的数据处理后的值所画出的曲线
但如果点击窗口右上角的最小化按钮,却不会执行到这一句,数据仍然读不进来,还原后数据就从最小化之时的数据接下去读,在最小化的状态下没有新数据读入。这时为什么啊?我纳闷到现在,请高人指教!



...全文
442 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kouwenlong 2009-11-01
  • 打赏
  • 举报
回复
mark
wanghao111 2009-11-01
  • 打赏
  • 举报
回复
帮你顶吧
musdenis 2009-11-01
  • 打赏
  • 举报
回复
那用窗口右上角的最小化与用任务栏的图标最小化有区别么,为什么两种最小化获得的IsInconic()状态不一样~
Kevin_Perkins 2009-11-01
  • 打赏
  • 举报
回复
你可以设置两个信号量,一个数据读取信号量,一个绘图信号量。
当窗口没有最小化时,数据读取线程与绘图线程通过改变数据读取信号量来完成交替运行,绘图信号量在绘图线程中控制是否在屏幕上绘制图形,它的值可以通过获取消息改变,即最小化信息时为假,不在绘制图形,非最小化消息(还原与最大化)时为真,绘制图形,将绘制图形部分的代码放在该信号量控制范围内。
arong1234 2009-11-01
  • 打赏
  • 举报
回复
1. 最小化状态下绘制屏幕是没有道理的,因此最小化情况下OnDraw不执行很正常.Windows一向按需绘图。
2. 你是否完成状态不应该依赖界面显示,数据采集和显示应该解耦合,因此应该在绘图之前就设置finish标志.而无论哪种情况,你都应该Invalidate
3. 对于你说的:"但是调试过程中,发现最小化或还原可以执行OnSysCommand中的代码,pDrawView->m_minimize也看着被修改了,"
这就要看你的pDrawView和实际的视图类对象是不是同一个C++对象。我看你后面有诸如Attach之类的代码,我估计你这里是一样的问题,你修改的是另外一个C++对象的m_minimize成员变量,而不是你想要的哪个
musdenis 2009-11-01
  • 打赏
  • 举报
回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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