注册 登录
编程论坛 C++教室

有关window编程多线程

九天冥盟 发布于 2018-12-16 21:20, 1654 次点击
这是Windows核心编程中的例子,我照打了一遍,就是添加了需要测试的任务(sleep(1000)),为什么输出结果都是0?求请教.

__int64 FileTimeToQuadWord(PFILETIME pft)
{
    return (Int64ShllMod32(pft->dwHighDateTime,32)| pft->dwLowDateTime);
}

void GetTaskTime()
{
    FILETIME ftKernelTimeStart,ftKernelTimeEnd;
    FILETIME ftUserTimeStart,ftUserTimeEnd;
    FILETIME ftDummy;
    __int64 qwKernelTimeElapsed,qwUserTimeElapsed,qwTotalTimeElapsed;
    GetThreadTimes(GetCurrentThread(),&ftDummy,&ftDummy,&ftKernelTimeStart,&ftUserTimeStart);
    //执行的任务
    Sleep(1000);
   
    GetThreadTimes(GetCurrentThread(),&ftDummy,&ftDummy,&ftKernelTimeEnd,&ftUserTimeEnd);
    qwKernelTimeElapsed=FileTimeToQuadWord(&ftKernelTimeEnd)-FileTimeToQuadWord(&ftKernelTimeStart);
    qwUserTimeElapsed=FileTimeToQuadWord(&ftUserTimeEnd)-FileTimeToQuadWord(&ftUserTimeStart);
    qwTotalTimeElapsed=qwKernelTimeElapsed+qwUserTimeElapsed;
    _tprintf(_T("kernel: %d,uer: %d, the total time elapsed is: %d"),qwKernelTimeElapsed,qwUserTimeElapsed,qwTotalTimeElapsed);
}

int _tmain(int argc, _TCHAR* argv[])
{
    GetTaskTime();
    system("pause");
    return 0;
}
1 回复
#2
rjsp2018-12-17 09:38
随手改的,可能代码不严格

程序代码:
#include <windows.h>
#include <stdio.h>

bool NotSleep( DWORD dwMilliseconds )
{
    LARGE_INTEGER frequency, starttime;
    if( !QueryPerformanceFrequency(&frequency) )
        return false;
    if( !QueryPerformanceCounter(&starttime) )
        return false;
    starttime.QuadPart += dwMilliseconds*frequency.QuadPart/1000;

    for( LARGE_INTEGER curtime; ; )
    {
        if( !QueryPerformanceCounter(&curtime) )
            return false;
        if( curtime.QuadPart >= starttime.QuadPart )
            break;
    }
    return true;
}

bool GetThreadTimeU64( unsigned long long& KernelTime, unsigned long long& UserTime )
{
    FILETIME ct, et, kt, ut;
    if( !GetThreadTimes(GetCurrentThread(),&ct,&et,&kt,&ut) )
        return false;

    KernelTime = (kt.dwHighDateTime+0ull)<<32 | kt.dwLowDateTime;
    UserTime = (ut.dwHighDateTime+0ull)<<32 | ut.dwLowDateTime;
    return true;
}

void GetTaskTime()
{
    unsigned long long KernelTimeStart, UserTimeStart;
    GetThreadTimeU64( KernelTimeStart, UserTimeStart );

    NotSleep( 1000 );

    unsigned long long KernelTimeEnd, UserTimeEnd;
    GetThreadTimeU64( KernelTimeEnd, UserTimeEnd );

    unsigned long long KernelTimeElapsed = KernelTimeEnd - KernelTimeStart;
    unsigned long long UserTimeElapsed = UserTimeEnd - UserTimeStart;
    unsigned long long TotalTimeElapsed = KernelTimeElapsed + UserTimeElapsed;

    printf( "kernel: %llu, user: %llu, the total time elapsed is: %llu\n", KernelTimeElapsed, UserTimeElapsed, TotalTimeElapsed );
}

int main( void )
{
    GetTaskTime();
    return 0;
}

1