因为什么,因为在内核下的运行通常是进程轮询线程是否有任务,时间很短,而在用户下的运行时间通常是用户触发线程的运行,同样通常也是很快就完成,所以楼主这样求得的仅仅是进程实际运行时间,至于创建的时间可以这样求:一种情况是关闭了的,即exittime-starttime(抽象化语言,楼主应该能懂),一种情况是进程未关闭,楼主可获取当前时间再减去创建时间点即可。
设置定时器,添加ontimer函数,在添加windows消息处理那个地方添加ontimer函数,初始化里添加
SetTimer( 1, 1, NULL ); //为时间设置定时器1秒
最详细的:
void SetIsotropic (HDC hdc, int cxClient, int cyClient)
{
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL) ;
SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
}
void RotatePoint (POINT pt[], int iNum, int iAngle)
{
int i ;
POINT ptTemp ;
for (i = 0 ; i < iNum ; i++)
{
ptTempx = (int) (pt[i]x cos (TWOPI iAngle / 360) +
pt[i]y sin (TWOPI iAngle / 360)) ;
ptTempy = (int) (pt[i]y cos (TWOPI iAngle / 360) -
pt[i]x sin (TWOPI iAngle / 360)) ;
pt[i] = ptTemp ;
}
}
void DrawClock (HDC hdc)
{
int iAngle ;
POINT pt[3] ;
for (iAngle = 0 ; iAngle < 360 ; iAngle += 6)
{
pt[0]x = 0 ;
pt[0]y = 900 ;
RotatePoint (pt, 1, iAngle) ;
pt[2]x = pt[2]y = iAngle % 5 33 : 100 ;
pt[0]x -= pt[2]x / 2 ;
pt[0]y -= pt[2]y / 2 ;
pt[1]x = pt[0]x + pt[2]x ;
pt[1]y = pt[0]y + pt[2]y ;
SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
Ellipse (hdc, pt[0]x, pt[0]y, pt[1]x, pt[1]y) ;
}
}
void DrawHands (HDC hdc, SYSTEMTIME pst, BOOL fChange)
{
static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,
0, -200, 50, 0, 0, 800, -50, 0, 0, -200,
0, 0, 0, 0, 0, 0, 0, 0, 0, 800 } ;
int i, iAngle[3] ;
POINT ptTemp[3][5] ;
iAngle[0] = (pst->wHour 30) % 360 + pst->wMinute / 2 ;
iAngle[1] = pst->wMinute 6 ;
iAngle[2] = pst->wSecond 6 ;
memcpy (ptTemp, pt, sizeof (pt)) ;
for (i = fChange 0 : 2 ; i < 3 ; i++)
{
RotatePoint (ptTemp[i], 5, iAngle[i]) ;
Polyline (hdc, ptTemp[i], 5) ;
}
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxClient, cyClient ;
static SYSTEMTIME stPrevious ;
BOOL fChange ;
HDC hdc ;
PAINTSTRUCT ps ;
SYSTEMTIME st ;
switch (message)
{
case WM_CREATE :
SetTimer (hwnd, ID_TIMER, 1000, NULL) ;
GetLocalTime (&st) ;
stPrevious = st ;
return 0 ;
case WM_SIZE :
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_TIMER :
GetLocalTime (&st) ;
fChange = stwHour != stPreviouswHour ||
stwMinute != stPreviouswMinute ;
hdc = GetDC (hwnd) ;
SetIsotropic (hdc, cxClient, cyClient) ;
SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
DrawHands (hdc, &stPrevious, fChange) ;
SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
DrawHands (hdc, &st, TRUE) ;
ReleaseDC (hwnd, hdc) ;
stPrevious = st ;
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
SetIsotropic (hdc, cxClient, cyClient) ;
DrawClock (hdc) ;
DrawHands (hdc, &stPrevious, TRUE) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY :
KillTimer (hwnd, ID_TIMER) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
这个其实还蛮容易的,你可以在OnInitialDialog里面加入时钟的界面代码(包括画一个时钟和三个表针),然后设置一个定时器,定时器周期设置成一秒,然后在定时器函数里面让时钟走动就可以了
如果在MFC中
使用
SetTimer(1,1000,NULL);//1000表示1秒为周期
响应WM_TIMER消息
void MyDlg::OnTimer(UINT nIDEvent)
{
//获取当前时间
CTime time = CTime::GetCurrentTime();
//m_Time为控件变量。为控件设置时间。
m_TimeSetWindowText(timeFormat("%H:%M:%S"));
CDialog::OnTimer(nIDEvent);
}
如果用win32 API写。
在消息WM_CREATE里
SetTimer (hwnd, ID_TIMER, 1000, NULL);
消息WM_TIMER里
InvalidateRect(hwnd, NULL, FALSE);
以上就是关于mfc获取进程运行时间全部的内容,包括:mfc获取进程运行时间、MFC中制作时钟的问题、求: 用mfc编一个模拟时钟程序。。急!!高手们帮忙~~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)