最近在做界面相关的东西,还是直接进入主题:
一个对话框,属性是child(不解释为什么是这个类型,但是程序所需),上面有个进度条子。还有一个按钮。
功能是:上传文件。
这个小界面的功能是,点击按钮后,选择要上传的文件,然后开启一个小线程去专门处理上传文件的部分。
在这里面,为了对对话框上的进度条子进行setpos,调用了诸如:hProgress=GetDlgItem、CProgressCtrl * cProgress = (CProgressCtrl *)CWnd::FromHandle(hProgress);等相关的代码
在开始的时候,这个代码没有问题。然后当进度条走到一段距离后,程序突然报错。显示afxcmn2.inl 363行。异常
去这里看了下,说 assert( iswindow(hwnd) 大致的意思就是说 这个hwnd为null。
然后为了验证这个问题,在代码增加了判断 if( cProgress == NULL || hProgress== NULL )等类似的判断
然后又debug程序,跑了会,就在这里弹出提示
说这个hwnd为null
=========================================================================================
如果这个有问题,为什么在开始到报错之间的一段时间内,这样调用上面的代码,却没有问题呢。
而是用着用着就报错了。
而且中途没有其他的操作 ,就是看着它走动进度条子。
用spy++ 也看了下,没看出什么问题来
------解决思路----------------------
以前做过显示进度条的功能,希望对你有用,做法如下:
新开线程进行数据上传,同时设置一个共享变量Var,对上传次数进行计数。界面线程中把SetPos(Var)放在timer中,可以实现对进度条的更新。
------解决思路----------------------
上面的 “// 工作者线程,处理所有的IOCP的完成通知”注释请无视
------解决思路----------------------
确定窗口线程没有被阻塞或者在进行耗时调用?表现形式就是窗口无响应,消息队列被阻塞,然后队列......满了