PostMessage()的参数很大,会不会导致CPU过高?

96掌门师兄 2012-01-04 04:34:32

在线程中,下了2张图片m_pLoadImage1和m_pLoadImage2成功后,使用PostMessage发送给窗体上显示出来,当开16个窗体(即16个下载线程)后,CPU过高,到了90%, 和参数数据过大有关吗?
::PostMessage(m_setImage,WM_USER + 101,(WPARAM)m_pLoadImage1,(LPARAM)m_pLoadImage2);
整个线程代码如下,大侠们帮忙看看,能降下CPU吗?:

//由外层调用,塞入图片URL下载
void addImage(std::string fileName)
{
try{
//锁住
EnterCriticalSection(&m_CriticalSection);
//插入队列
if(fileQueue.size() < 10)
fileQueue.push(fileName);
else if(fileQueue.size() >= 10)
{fileQueue.pop();
fileQueue.push(fileName);
}
//设置为有信号状态
eventFile.SetEvent();
//解锁
LeaveCriticalSection(&m_CriticalSection);
}
catch(...)
{}
}

//线程函数
void run()
{
char* szFunc = "DownLoadImage::run()";

try {
Debug("Thread %u started with DownLoadImage.run()\r\n", ::GetCurrentThreadId());
while(!stopping)
{
::WaitForSingleObject(eventFile,INFINITE);
Sleep(10000);
while(!fileQueue.empty())
{
std::string FileName = fileQueue.front();
Debug(("> Thread %u (%s)\r\n"), ::GetCurrentThreadId(),FileName.c_str());
FIBITMAP *m_pLoadImage1 = NULL;//在消息处理函数里释放
FIBITMAP *m_pLoadImage2 = NULL;//在消息处理函数里释放
int result = 0;
char img1[MAX_PATH] = {0};
char img2[MAX_PATH] = {0};
int len = strlen(FileName.c_str());
for(int i = 0; i < len; i++)
{
if(',' != FileName[i])
{img1[i] += FileName[i];
}
else
{
img1[i] = '\0';
memcpy(img2, &FileName[i + 1], len - 1 - i);
img2[len - 1 - i] = '\0';
break;
}
}

if( strlen(img1) > 0 )
{
result = m_imageLoader.LoadFiBitmap(img1, NORES, &m_pLoadImage1, NULL);
}

if( strlen(img2) > 0 )
{
result = m_imageLoader.LoadFiBitmap(img2, NORES, &m_pLoadImage2, NULL);

}
if( result != ImageLoader::IMG_OK )
{
CSOUT1( "AxCUImage::Load LoadBitmap1 failed: %d\n", result );
Debug(("> downLoad failed(%s)\r\n"), FileName.c_str());

if(m_pLoadImage1)
{
::FreeImage_Unload(m_pLoadImage1);
m_pLoadImage1 = NULL;
}
if(m_pLoadImage2)
{
::FreeImage_Unload(m_pLoadImage2);
m_pLoadImage2 = NULL;
}
}
else
{
if(m_pLoadImage1 || m_pLoadImage2)
{
::PostMessage(m_setImage,WM_USER + 101,(WPARAM)m_pLoadImage1,(LPARAM)m_pLoadImage2);
}

}
//锁住
EnterCriticalSection(&m_CriticalSection);
//剔出队列
fileQueue.pop();
//解锁
LeaveCriticalSection(&m_CriticalSection);

}
//设置为无信号状态
eventFile.ResetEvent();
}
bstarting = false;
Debug("Thread %u finished with DownLoadImage.run()\r\n", ::GetCurrentThreadId());
} catch (Poco::Exception e) {
Debug("%s error %s %s\r\n", szFunc, e.what(), e.displayText());
} catch (std::exception e) {
Debug("%s error %s \r\n", szFunc, e.what());
} catch (...) {
Debug("%s Unknow error occured\r\n", szFunc);
}
}

...全文
222 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuucyf 2012-01-05
  • 打赏
  • 举报
回复
瓶颈可能是在图片的处理,显示上面,或者是在你的任意一个线程函数的操作上.
往这两个方面进行检查.
龙行天下之Sky 2012-01-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jennyvenus 的回复:]

如果你是不停的更新,那在线程里绘画就行了。
[/Quote]

所有涉及到UI的操作应该放到一个线程里,跨线程绘制会出问题的
龙行天下之Sky 2012-01-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaoxiaoyu85 的回复:]

引用 6 楼 sky101010ws 的回复:
引用 4 楼 xiaoxiaoyu85 的回复:

引用 1 楼 oyljerry 的回复:
发送消息是指针,应该数据还好,估计更大瓶颈是在图片的处理,显示上面,那个比较耗用CPU


的确是的,使用的GDI+在OnPaint()绘制的,屏蔽绘制的是时候,cpu在50%左右,但是偶尔会到80% -90&amp;amp;,估计是……
[/Quote]

说错话了,绘画要在OnPaint或OnDraw里,不过控制绘图的逻辑以及计算绘图的区域相关逻辑不要放在OnPaint里
用户 昵称 2012-01-05
  • 打赏
  • 举报
回复
如果你是不停的更新,那在线程里绘画就行了。
96掌门师兄 2012-01-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sky101010ws 的回复:]
引用 4 楼 xiaoxiaoyu85 的回复:

引用 1 楼 oyljerry 的回复:
发送消息是指针,应该数据还好,估计更大瓶颈是在图片的处理,显示上面,那个比较耗用CPU


的确是的,使用的GDI+在OnPaint()绘制的,屏蔽绘制的是时候,cpu在50%左右,但是偶尔会到80% -90&amp;,估计是在外层不停的调用addImage()的时候到的峰值.

……
[/Quote]
不在OnPaint里面在哪绘制比较好呢? OnDraw也是一样的吧? 求教,谢谢了。
用户 昵称 2012-01-04
  • 打赏
  • 举报
回复
不会。
  • 打赏
  • 举报
回复
PostMessage不是阻塞式的 和它没关系
Eleven 2012-01-04
  • 打赏
  • 举报
回复
PostMessage应该不至于,CPU高应该是你的处理上
龙行天下之Sky 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiaoxiaoyu85 的回复:]

引用 1 楼 oyljerry 的回复:
发送消息是指针,应该数据还好,估计更大瓶颈是在图片的处理,显示上面,那个比较耗用CPU


的确是的,使用的GDI+在OnPaint()绘制的,屏蔽绘制的是时候,cpu在50%左右,但是偶尔会到80% -90&,估计是在外层不停的调用addImage()的时候到的峰值.
[/Quote]

参数不会有问题,用参数地址传递一点问题都没有
cpu是由于你的频繁OnPaint有关,一般不要再OnPaint里画图
96掌门师兄 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 charmign1 的回复:]
16个下载线程还想不耗CPU,要求不要那么高
[/Quote]

不是死循环,有语句: fileQueue.push(fileName);
96掌门师兄 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
发送消息是指针,应该数据还好,估计更大瓶颈是在图片的处理,显示上面,那个比较耗用CPU
[/Quote]

的确是的,使用的GDI+在OnPaint()绘制的,屏蔽绘制的是时候,cpu在50%左右,但是偶尔会到80% -90&,估计是在外层不停的调用addImage()的时候到的峰值.
zhanshen2891 2012-01-04
  • 打赏
  • 举报
回复
while(!fileQueue.empty())


你这是死循环吧!!!!

charmign1 2012-01-04
  • 打赏
  • 举报
回复
16个下载线程还想不耗CPU,要求不要那么高
oyljerry 2012-01-04
  • 打赏
  • 举报
回复
发送消息是指针,应该数据还好,估计更大瓶颈是在图片的处理,显示上面,那个比较耗用CPU

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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