PostMessage()的参数很大,会不会导致CPU过高?
在线程中,下了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);
}
}
[解决办法]
发送消息是指针,应该数据还好,估计更大瓶颈是在图片的处理,显示上面,那个比较耗用CPU
[解决办法]
16个下载线程还想不耗CPU,要求不要那么高
[解决办法]
while(!fileQueue.empty())
你这是死循环吧!!!!
[解决办法]
[解决办法]
PostMessage应该不至于,CPU高应该是你的处理上
[解决办法]
PostMessage不是阻塞式的 和它没关系
[解决办法]
不会。
[解决办法]
如果你是不停的更新,那在线程里绘画就行了。
[解决办法]
[解决办法]
[解决办法]
瓶颈可能是在图片的处理,显示上面,或者是在你的任意一个线程函数的操作上.
往这两个方面进行检查.