#include <iostream>
#include <windows.h>
// 编写函数打印指定线程的创建时间,要求接受一个线程句柄
VOID GetThreadCreateTime(HANDLE Thread)
{
// 创建结构体用于保存获取到的和线程相关的时间戳
FILETIME CreateTime{}, ExitTime{};
FILETIME UserTime{}, KernelTime{};
// 使用函数获取到线程的创建时间
GetThreadTimes(Thread, &CreateTime, &ExitTime, &UserTime, &KernelTime);
// 将时间戳转换为当前时区表示的时间
FILETIME LocalTime{};
FileTimeToLocalFileTime(&CreateTime, &LocalTime);
// 将时间戳转换为时间结构体
SYSTEMTIME SystemTime{};
FileTimeToSystemTime(&LocalTime, &SystemTime);
// 输出指定线程的创建时间
printf("%d 时 %d 分 %d 秒\n", SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
}
// 一个线程,输出参数指定的线程的创建时间
DWORD CALLBACK WorkerThread(LPVOID Paramater)
{
// 通过强制类型转换获取到传入的线程句柄
HANDLE Thread = (HANDLE)Paramater;
// 在当前线程中得到的实际上是主线程的伪句柄,也就是 -2,-2永远代表的都是当前的
// 线程,所以下面的函数,输出的就是当前线程的创建时间,而不是主线程的创建时间
GetThreadCreateTime(Thread);
return 0;
}
int main()
{
// 获取当前线程的伪句柄,计算当前线程的创建时间。线程的伪句柄始终是 -2,进程是 -1
HANDLE MainThread = GetCurrentThread();
// 在主线程中首先打印主线程的创建时间
GetThreadCreateTime(MainThread);
// 等待两秒钟,创建一个新的线程,将主线程的句柄传入,计算线程的创建时间
Sleep(2000);
HANDLE Thread = CreateThread(NULL, 0, WorkerThread, (LPVOID)MainThread, 0, NULL);
// 为了确保线程执行完毕,应该等待线程
WaitForSingleObject(Thread, INFINITE);
return 0;
}