请问如何做到?
解决方案 »
- 如何将电脑屏幕保存为一张图片?
- DLL问题
- MoveWindow,好奇怪........
- MFC Feature Pack开发的程序支持2000操作系统吗?
- 怎么修改位图呀?
- 吐血给分(共190分全数奉上):delphi调用vc写的dll子窗口
- dll中这样调用MessageBox("how are you")时出错为何?代码是...
- 一个急的问题
- 请问各位网络多媒体制作软件高手:Dreamweaver的网页制作功能怎样。
- 有哪位知道huffman c语言编码的 过程说明?
- 按下按钮,跳转后对话框不会关闭,要等弹出的对话框关闭了它才关闭。。为什么啊!还有请问怎样同时向数据库增加多条记录啊。。
- 我做了一个网络文件传输软件,存在两个问题不知道解决请高手点拨下。1、为每个用户连接开启一个线程(有限个)2、客户端显示服务端文件夹目录。
所以要根据运行情况调整
#include <windows.h>
#include <stdio.h>
#define RATE 0.50
#define ERROR_VALUE 0.001
#define SAMPLE_GRANULARITY 20000000
#define FILETIME_TO_LARGEINTEGER(li, ft) \
((li)->HighPart = (ft).dwHighDateTime, (li)->LowPart = (ft).dwLowDateTime)typedef struct _cpu_usage_t
{
double rate;
double lastrate;
LARGE_INTEGER start;
LARGE_INTEGER used;
LARGE_INTEGER usage;
LARGE_INTEGER total;
UINT counter;
}cpu_usage_t;typedef struct _worker_t
{
cpu_usage_t usage;
HANDLE hd;
DWORD mask;
}worker_t;BOOL get_cpu_usage(cpu_usage_t *pret)
{ FILETIME ftStart, ftDummy, ftKernel, ftUser, ftCurrent;
LARGE_INTEGER liKernel, liUser, liCurrent;
SYSTEMTIME stCurrentTime; if (pret->start.QuadPart == 0)
{
GetProcessTimes(GetCurrentProcess(), &ftStart, &ftDummy, &ftDummy, &ftDummy);
FILETIME_TO_LARGEINTEGER(&pret->start, ftStart);
pret->start.QuadPart = 0;
} GetSystemTime(&stCurrentTime);
SystemTimeToFileTime(&stCurrentTime, &ftCurrent);
FILETIME_TO_LARGEINTEGER(&liCurrent, ftCurrent);
pret->total.QuadPart = liCurrent.QuadPart - pret->start.QuadPart; GetProcessTimes(GetCurrentProcess(), &ftDummy, &ftDummy, &ftKernel, &ftUser);
FILETIME_TO_LARGEINTEGER(&liKernel, ftKernel);
FILETIME_TO_LARGEINTEGER(&liUser, ftUser);
pret->usage.QuadPart = liKernel.QuadPart + liUser.QuadPart - pret->used.QuadPart; pret->rate = (double)pret->usage.QuadPart / (double)pret->total.QuadPart; if (pret->total.QuadPart >= SAMPLE_GRANULARITY)
{
pret->start.QuadPart = liCurrent.QuadPart;
pret->used.QuadPart = liKernel.QuadPart + liUser.QuadPart;
pret->counter ++;
} return TRUE;
}void use_cpu()
{
return;
}DWORD WINAPI worker(LPVOID lpPara)
{ worker_t* pworker;
double prevrate = 0.0;
UINT precounter = 0; pworker = (worker_t*)lpPara; SetThreadAffinityMask(GetCurrentThread(), pworker->mask); memset(&pworker->usage, 0, sizeof(pworker->usage));
precounter = pworker->usage.counter; while (1)
{
get_cpu_usage(&pworker->usage); if (precounter != pworker->usage.counter)
{
printf("ThreadAffinityMask:%x : %2.3f\n", pworker->mask, pworker->usage.rate);
precounter = pworker->usage.counter;
} if (pworker->usage.rate >= RATE)
{
Sleep(1);
}
else if (pworker->usage.rate < RATE)
{
use_cpu();
} }
}static worker_t _wokers[32];int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwPAM, dwSAM, dwTemp1, dwTemp2, dwTemp3;
HANDLE hProc;
UINT i = 0; hProc = GetCurrentProcess();
GetProcessAffinityMask(hProc, &dwPAM, &dwSAM); dwTemp1 = dwSAM; while (dwTemp1 != 0)
{
dwTemp2 = dwTemp1 - 1;
dwTemp2 &= dwTemp1;
dwTemp3 = dwTemp2;
dwTemp2 = dwTemp2 ^ dwTemp1;
dwTemp1 = dwTemp3; if (dwTemp2 != 0)
{
_wokers[i].mask = dwTemp2;
_wokers[i].hd = CreateThread(NULL, 0, worker, (LPVOID)&_wokers[i], 0, NULL);
i++;
}
} Sleep(100000); return 0;
}
=========================================================================================
在单核上是50%
没有考虑清楚怎么在多核上保证50%
GetProcessTimes(GetCurrentProcess(), &ftStart, &ftDummy, &ftDummy, &ftDummy);
替换成
GetThreadTimes(GetCurrentThread(), &ftStart, &ftDummy, &ftDummy, &ftDummy);