首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

小弟我的程序为什么cpu占用90%

2012-01-26 
我的程序为什么cpu占用90%?对话框程序,处理批量文件的.主线程(按钮事件函数)为每一个文件create了一个线程

我的程序为什么cpu占用90%?
对话框程序,处理批量文件的.
主线程(按钮事件函数)为每一个文件create了一个线程,线程内部creatfile打开文件,然后读到new的一个文件大小的缓冲区处理.

1.如果同时处理的文件数量比较多的话(10个以上,每个文件5M),就会出现主界面更新失去响应,cpu占用过高,别的应用程序也失去响应.
2.内存占用过大,如果我同时处理1000个文件的话,系统的虚拟内存估计会被耗尽.


以上两个问题有什么好的解决办法没有?

[解决办法]
为解决占用内存过多,我的看法是使用filemapping
cpu利用率过高应该也可以通过使用FileMapping解决,因为这样减少了分配内存产生的开销
[解决办法]
多线程只能解决界面响应问题,其实并不能提高CPU利用率,由于线程切换反而带来CPU利用率的下降。所以只有限制同时打开的线程数量。可以利用线程池,或者自己安排任务,分开执行。
[解决办法]
限制线程的 cpu 占用率
[解决办法]
I/O本来就是资源的瓶颈,lz还开这么多的线程去读取文件。
所有的线程最终都是通过调用磁头读取数据的,线程越多,磁头移动
距离也就越长,花费时间也就越多。

建议1个主线程负责读数据(文件),读出来交给其他线程处理。
[解决办法]
分批处理不行么,一次处理几个文件,分多次处理。小文件就一次多处理几个,大文件一次少处理几个。资源占用不能多的话,只有一次少处理几个文件了,如果开很多线程同时处理很多文件资源占用自然不会少的
[解决办法]
对各文件对应一个或者多个线程,线程数不是越多越好。这样可以配配固定的缓冲区的大小来处多个文件。
[解决办法]
线程池 什么玩意?
[解决办法]
一个池塘,里面很多线程, 就是线程池了。
如果里面还有几只泥鳅的话, 就是非完全线程池。
[解决办法]
随便写了一个,线程池+file mapping,没有调试

#include <stdio.h>
#include <stdlib.h>

#define _WIN32_WINNT 0x0500

#include <windows.h>

char* filetable[] = {
"test1.txt ",
"test2.txt ",
"test3.txt ",
"test4.txt ",
"test5.txt ",
};

LONG g_Counter = 0;

typedef struct _fhpara_t
{
char* pszfilename;
HANDLE hevent;
}fhpare_t;

DWORD WINAPI MyFileHandler( LPVOID lpParameter )
{
fhpare_t* pfhp = (fhpare_t*)lpParameter;
HANDLE hf, hfm;
char* pCursor;
int i = 0;

hf = CreateFile( pfhp-> pszfilename,
FILE_ALL_ACCESS,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
if( hf == 0 )
{
return 1;
}

hfm = CreateFileMapping( hf, NULL, PAGE_READWRITE, 0, 0, NULL );
if( hfm == 0 )
{
CloseHandle( hf );
return 1;
}

pCursor = (char*)MapViewOfFile( hfm, FILE_MAP_COPY, 0, 0, 0 );

/* Access the file as the file was in memory */
for( i = 0; i < 100; i++ )
printf( "%02x ", pCursor[i] );

for( i = 0; i < 100; i++ )
pCursor[i] = i;

UnmapViewOfFile( pCursor );

CloseHandle( hfm );
CloseHandle( hf );

if( InterlockedDecrement( &g_Counter ) == 0 )
SetEvent( pfhp-> hevent );

return 0;

}

int main()
{
int i;
HANDLE hevent;

g_Counter = sizeof( filetable ) / sizeof( filetable[0] );

hevent = CreateEvent( NULL, TRUE, FALSE, NULL );
if( hevent == NULL )
exit(1);



for( i = 0; i < sizeof( filetable ) / sizeof( filetable[0] ); i++ )
QueueUserWorkItem( MyFileHandler, (LPVOID)filetable[i], WT_EXECUTEDEFAULT );

WaitForSingleObject( hevent, 50000L );

system( "PAUSE " );
return 0;

}

热点排行