如何判断一个进程已经完成初始化?
最近,我尝试对我项目里面的DLL文件的基址重新定位,因为重定位可以提高系统的启动速度。在完成了重定位之后,我想测量一下我的应用的启动速度到底有了多大的提升。但是如何判断一个进程是不是已经完成了初始化呢?一个Windows API帮助了我:WaitForInputIdle"。 这个API函数一直等待知道指定的进程在创建该应用的第一个窗口的线程中没有任何阻塞的输入。
#include <windows.h>
#include <iostream>
__int64 FileTimeToQuadWord(PFILETIME pft)
{
return (Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
FILETIME ftDummy, ftKernelTime, ftUserTime;
__int64 qwTotalTime = 0, qwTotalTimeR = 0;
for (int i = 0; i < 10; i++)
{
CreateProcess(TEXT("Executable file path"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si,
&pi);
WaitForInputIdle(pi.hProcess, INFINITE);
TerminateProcess(pi.hProcess, 0);
GetProcessTimes(pi.hProcess, &ftDummy, &ftDummy, &ftKernelTime, &ftUserTime);
CloseHandle(pi.hProcess);
qwTotalTime += (FileTimeToQuadWord(&ftKernelTime) + FileTimeToQuadWord(&ftUserTime));
}
std::cout << qwTotalTime / (float)10000000 << 's' << std::endl;
return 0;
}
顺便提一下,在我的例子中基址重定位提高了6%的启动性能。