Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
c++¶àÏß³Ì
 
×÷Õߣºricherg85 À´Ô´£ºCSDN ·¢²¼ÓÚ£º2015-6-17
  3895  次浏览      30
 

¶àÏ̵߳ļò½é

Ïß³Ì---²Ù×÷ϵͳµ÷¶ÈµÄ×îСµ¥Î»¡£Ḭ̈߳üº¬ÔÚ½ø³ÌÖУ¬Êǽø³ÌÖÐʵ¼ÊÔËÐеĵ¥Î»¡£Ò»¸ö½ø³ÌÖпÉÒÔͬʱÔËÐжà¸öỊ̈߳¬Ã¿¸öÏ߳̿ÉÒÔÖ´Ðв»Í¬µÄÈÎÎñ£¬Õâ¾ÍÊÇËùνµÄ¶àÏ̡߳£Í¬Ò»½ø³ÌÖеĶà¸öÏ߳̽«¹²Ïí¸Ã½ø³ÌÖеÄÈ«²¿ÏµÍ³×ÊÔ´£¬ÈçÐéÄâµØÖ·¿Õ¼ä¡¢ÎļþÃèÊö·ûºÍÐźŴ¦ÀíµÈ£¬µ«ÊÇͬһ¸ö½ø³ÌÖеĶà¸öÏ̶߳¼Óи÷×Եĵ÷ÓÃÕ»¡¢¼Ä´æÆ÷»·¾³ºÍÏ̱߳¾µØ´æ´¢¡£

¶ÔÓÚµ¥ºË£¨µ¥CPU£©ÏµÍ³À´Ëµ£¬¼´±ã´¦ÀíÆ÷Ò»´ÎÖ»ÄÜÔËÐÐÒ»¸öỊ̈߳¬µ«ÊDzÙ×÷ϵͳͨ¹ýʱ¼äƬÂÖת¼¼Êõ£¬ÔÚ²»Í¬µÄÏß³ÌÖ®¼ä½øÐÐÇл»£¬ÈÃÓû§²úÉú¿ÉÒÔͬʱ´¦Àí¶à¸öÈÎÎñµÄ´í¾õ£¬ÕâÑùµÄ³ÌÐòÔËÐлúÖÆ³ÆÎªÈí¼þµÄ¶àÏ̡߳£

¶ÔÓÚ¶àºË£¨¶à¸öCPU£©ÏµÍ³À´Ëµ£¬ÕâÑùµÄϵͳÄÜͬʱ½øÐÐÕæÕýµÄ¶àÏ̶߳àÈÎÎñ´¦Àí¡£ÕâÖÖÔËÐлúÖÆ¿ÉÒÔ³ÆÎªÓ²¼þµÄ¶àÏ̼߳¼Êõ¡£

¶àÏ̳߳ÌÐò×÷ΪһÖÖ¶àÈÎÎñ¡¢²¢·¢µÄ¹¤×÷·½Ê½£¬µ±È»ÓÐÒÔϵÄÓŵ㣺

1) Ìá¸ßÓ¦ÓóÌÐòÏìÓ¦¡£Õâ¶ÔͼÐνçÃæµÄ³ÌÐòÓÈÆäÓÐÒâÒ壬µ±Ò»¸ö²Ù×÷ºÄʱºÜ³¤Ê±£¬Õû¸öϵͳ¶¼»áµÈ´ýÕâ¸ö²Ù×÷£¬´Ëʱ³ÌÐò²»»áÏìÓ¦¼üÅÌ¡¢Êó±ê¡¢²Ëµ¥µÄ²Ù×÷£¬¶øÊ¹ÓöàÏ̼߳¼Êõ£¬½«ºÄʱ³¤µÄ²Ù×÷£¨time consuming£©ÖÃÓÚÒ»¸öеÄỊ̈߳¬¿ÉÒÔ±ÜÃâÕâÖÖÞÏÞεÄÇé¿ö¡£

2) ʹ¶àCPUϵͳ¸ü¼ÓÓÐЧ¡£²Ù×÷ϵͳ»á±£Ö¤µ±Ïß³ÌÊý²»´óÓÚCPUÊýĿʱ£¬²»Í¬µÄÏß³ÌÔËÐÐÓÚ²»Í¬µÄCPUÉÏ¡£

3) ¸ÄÉÆ³ÌÐò½á¹¹¡£Ò»¸ö¼È³¤ÓÖ¸´ÔӵĽø³Ì¿ÉÒÔ¿¼ÂÇ·ÖΪ¶à¸öỊ̈߳¬³ÉΪ¼¸¸ö¶ÀÁ¢»ò°ë¶ÀÁ¢µÄÔËÐв¿·Ö£¬ÕâÑùµÄ³ÌÐò»áÀûÓÚÀí½âºÍÐ޸ġ£

¶àÏ̱߳à³ÌʵÀý1

˵Ã÷£º±¾ÏµÁÐËùÓеÄʵÀý¶¼ÊÇÔÚvc6.0ÏÂʵÏֵ쬲¢ÇÒ¶¼ÊÇ»ùÓÚMFC AppWizard[exe]¹¤³Ì´´½¨µÄ¡°Dialog based¡±Ó¦ÓóÌÐò¡£

ʵÀý1£¬¼òµ¥µÄ¶àỊ̈߳¬ÊµÏÖ¶¯Ì¬ÏÔʾʱ¼ä

¹¤³ÌÃû³ÆÎªMthread1,Ê×ÏÈÔÚMthread1Dlg.hÖÐÉùÃ÷Ï̺߳¯Êý---void ThreadProc()£¬´Ëº¯ÊýΪȫ¾Öº¯Êý¡£

²¿·Ö´úÂëÈçÏ£º

// Mthread1Dlg.h : header file  
//
... ...

void ThreadProc();//Ï̺߳¯ÊýÉùÃ÷
class CMthread1Dlg : public CDialog
{
... ...
protected:
HICON m_hIcon;
HANDLE hThread;//Ï߳̾ä±ú
... ...

DECLARE_MESSAGE_MAP()
};

MthreadDlg.cpp

// Mthread1Dlg.cpp : implementation file  
//

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
volatile BOOL m_bRun;//´ú±íÏß³ÌÊÇ·ñÕý³£ÔËÐÐ

void ThreadProc() //Ï̺߳¯Êý
{
CTime time;
CString strTime;
m_bRun = TRUE;

while(m_bRun)
{
time = CTime::GetCurrentTime();
strTime = time.Format("%H:%M:%S");

::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
Sleep(1000);
}
}
class CAboutDlg : public CDialog
{
... ...
void CMthread1Dlg::OnStart()
{
// TODO: Add your control notification handler code here
hThread = CreateThread(
NULL, // SD
0, // initial stack size
(LPTHREAD_START_ROUTINE)ThreadProc, // thread function
NULL, // thread argument
0, // creation option
&threadID // thread identifier
);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}

void CMthread1Dlg::OnStop()
{
// TODO: Add your control notification handler code here
m_bRun = FALSE;
GetDlgItem(IDC_START)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}

Ö´Ðнá¹û£º

ÏàÓ¦º¯ÊýAPI˵Ã÷

CreateThread

º¯ÊýÔ­ÐÍ£º

HANDLE CreateThread(  
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
DWORD dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);

´Ëº¯ÊýÔÚÆäµ÷Óýø³ÌµÄ½ø³Ì¿Õ¼äÀï´´½¨Ò»¸öÏ̡߳£

²ÎÊý˵Ã÷£º

lpThreadAttributes:Ö¸ÏòSECURITY_ATTRIBUTES½á¹¹Ì壬¸Ã½á¹¹Ìå¾ö¶¨Á˺¯Êý·µ»Ø¾ä±úÊÇ·ñ±»×Ó½øÏ̼̳߳С£

Èç¹ûΪNULL,Ôò²»Äܱ»¼Ì³Ð¡£

dwStackSize:Ö¸¶¨ÁËÏ̵߳ĶÑÕ»´óС£¬Ò»°ãΪ0£¬Ê¹ÓÃĬÈϵĶÑÕ»´óС¡£

lpStartAddress:Ö¸ÏòÓ¦Óö¨ÒåµÄÏ̺߳¯Êý£¬Ï̺߳¯ÊýÀàÐÍΪLPTHREAD_START_ROUTINE¡£´ËÖµ´ú±íÏ̵߳ĿªÊ¼µØÖ·¡£

lpParameter:Ï̺߳¯ÊýËù´øµÄ²ÎÊý¡£ÊÇÒ»¸öÖ¸Ïò½á¹¹µÄÖ¸Õ룬²»Ðè´«µÝ²ÎÊýʱ£¬ÎªNULL¡£

dwCreateFlags:Ï̱߳êÖ¾¡£Èç¹ûÖ¸¶¨ÎªCREATE_SUSPENDED£¬Ï̴߳´½¨µÄʱºòµÄ״̬Ϊ¹ÒÆð״̬£¬

Ï̲߳»»áÁ¢¼´Ö´ÐÐÖ±µ½µ÷ÓÃResumeThreadº¯Êý¡£

Èç¹ûֵΪ0£¬Ï̻߳áÁ¢¼´Ö´ÐС£

lpThreadId:±£´æÐÂÏ̵߳Äid.

¶àÏß³ÌʵÀý¶þ

´ËʵÀýÑÝʾ²ÉÓÃCreateThreadº¯ÊýÔÚÖ÷Ïß³ÌÖд´½¨Ò»¸öỊ̈߳¬²¢ÇÒÏò´´½¨µÄÏß³ÌÖд«µÝÒ»¸ö²ÎÊý¡£

ÓÉÓÚ²ÉÓÃMFC±à³Ì£¬×Ô¶¯Éú³ÉµÄ´úÂë±È½Ï¶à£¬»¹ÊÇÁгö²¿·ÖʵÏÖ¶àÏ̵߳ĴúÂë¡£

Ï̺߳¯Êý£º

void ThreadProc(int count)  
{
for (int i=0; i < count; i++)
{
Beep(2000,50);
Sleep(200);
}
}

Ö÷Ï̺߳¯Êý£º

void CMthread2Dlg::OnStart()   
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);//´Ó¿Ø¼þÖмìË÷Êý¾Ý
int count = m_count;


hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProc,
(VOID *)count,
0,
&threadID
);


GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE); //µ±Ïß³Ì¹ÒÆðʱ£¬ÎªÓÐÐźÅ״̬
GetDlgItem(IDC_START)->EnableWindow(TRUE);
}

×¢£º±äÁ¿m_countºÍ¿Ø¼þIDC_COUNT×öÁ˹ØÁª¡£

º¯Êý˵Ã÷£º

BOOL UpdateData( BOOL bSaveAndValidate = TRUE );

MFCÖеĴ°¿Úº¯Êý£¬ÔÚ¶Ô»°¿òÖУ¬µ±½¨Á¢¿Ø¼þºÍ±äÁ¿Ö®¼äµÄ¹ØÁª¹ØÏµºó£¬Ð޸ıäÁ¿Öµ£¬Ï£Íû¶Ô»°¿ò¸üÐÂÏÔʾ£¬ÔòbSaveAndValidate=FALSE,¼´µ÷ÓÃUpdateData(FALSE);µ±ÐèÒª»ñÈ¡¶Ô»°¿òÖпؼþÊäÈëµÄֵʱ£¬ÔòbSaveAndValidate=TRUE,¼´µ÷ÓÃUpdateData(TRUE)¡£

DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);

´Ëº¯ÊýµÄÏêϸÃèÊö²Î¼û£ºhttp://blog.csdn.net/richerg85/article/details/7354154

×¢Ò⣺

Ö÷Ïß³ÌÖУ¬µ÷ÓÃÁËWaitForSingleObjectº¯Êý£¬´Ëº¯ÊýµÄ×÷ÓÃÊǼàÊÓhHandleµÄ״̬£¬µ±¼àÊӵľä±úΪÓÐÐźÅ״̬ʱ£¬¼´´Ë¶ÔÏóΪ¿ÕÏÐ״̬ʱ£¬´Ëº¯Êý·µ»Ø£¬²ÅÄÜÖ´ÐÐÆäºóµÄ´úÂë¡£

ÔÚ´Ë´¦£¬ÓÃWaitForSingleObject×÷Óãº

ÓÉÓÚc++Ö÷³ÌÐòÖÕÖ¹£¬Í¬Ê±Ëü´´½¨µÄÏàÓ¦µÄÏß³ÌÒ²»áÖÕÖ¹£¬Ëü²»¹Ü×ÓÏß³ÌÊÇ·ñÖ´ÐÐÍê³É£¬Òò´Ë£¬ÉÏÎÄÖÐÈç¹û²»µ÷ÓÃWaitForSingleObjectº¯Êý£¬Ôò×ÓÏß³ÌThreadProc¿ÉÄÜûÓÐÖ´ÐÐÍê»òÕßûִÐС£

´Ë³ÌÐòÖ´Ðнá¹ûͼ£º

¶àÏß³ÌʵÀýÈý

´ËʵÀýÑÝʾ¶àÏß³ÌÖУ¬Ö÷Ïß³ÌÏò×ÓÏ̴߳«µÝÒ»¸ö½á¹¹Ìå¡£

ÔÚÍ·ÎļþÖУ¬ÉùÃ÷Ï̺߳¯Êý¼°½á¹¹Ì壺

UINT ThreadProc(LPVOID lpParam);  
struct threadInfo
{
UINT nMilliSecond;
CProgressCtrl *pctrProcess;
};

×ÓÏ̶߳¨Ò庯Êý

threadInfo myInfo;  
UINT ThreadProc(LPVOID lpParam)
{
threadInfo *pInfo = (threadInfo *)lpParam;
for (int i=0; i<100; i++)
{
int iTmp = pInfo->nMilliSecond;
pInfo->pctrProcess->SetPos(i);
Sleep(iTmp);
}
return 0;
}

Ö÷Ï̵߳÷ÓÃ×ÓÏ̺߳¯Êý£º

void CMthread3Dlg::OnStart()   
{
// TODO: Add your control notification handler code here
UpdateData();//ĬÈÏΪTRUE
myInfo.nMilliSecond = m_nMillSecond;
myInfo.pctrProcess = &m_ctrProcess;

hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProc,
&myInfo,
0,
&threadID
);
/*GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);*/
}

×¢Òâ×¢Ê͵IJ¿·Ö£¬Èç¹ûµ÷ÓÃWaitForSingleObjectº¯Êý£¬´Ë³ÌÐò»á³öÏÖËÀËø¡£ÒòΪ¶Ô»°¿òÖÐÓиö½ø¶ÈÌõ£¬×ÓÏß³ÌÖÐÉèÖýø¶ÈÌõµÄ½ø¶È£¬µ«Êǽø¶ÈÌõµÄË¢ÐÂÐèÒªÖ÷Ïß³ÌÀ´Íê³É£¬µ±Ö÷Ï̵߳÷ÓÃWaitForSingleObjectº¯Êý¹ÒÆðºó£¬×ÓÏß³ÌÉèÖÃÕýÔÚÉèÖýø¶ÈÌõ£¬Ò»Ö±µÈ´ýÖ÷Ï߳̽«Ë¢ÐÂÏûÏ¢³öÀ´Íê±Ï·µ»Ø²Å¼ì²â֪ͨʼþ¡£ÕâÑùÁ½¸öÏß³ÌÒ»Ö±´¦ÓÚÏ໥µÈ´ý£¬³öÏÖËÀËø¡£

³ÌÐòÖ´Ðнá¹û£º

¶àÏß³ÌʵÀý4

´ËʵÀýÑÝʾÄãµÄ»úÆ÷×î¶àÄÜ´´½¨¶àÉÙ¸öÏ̡߳£´ËʵÀý³ÌÐòÏ൱¼òµ¥¡£

Ï̺߳¯Êý£º

volatile BOOL m_bRUN = TRUE; //±íʾÊÇ·ñÄܼÌÐøÌí¼ÓÏß³Ì  
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
while (m_bRUN)
{
Sleep(2000);
}
return 0;
}

Ö÷Ï̺߳¯Êý£º

void CMthread4Dlg::OnStart()   
{
// TODO: Add your control notification handler code here
DWORD threadID;
long nCount = 0;
m_nCount = 0;
UpdateData(FALSE);
GetDlgItem(IDC_START)->EnableWindow(FALSE);


while (m_bRUN)
{
if (CreateThread(NULL,0,ThreadProc,NULL,0,&threadID) == NULL)
{
m_bRUN = FALSE;
break;
}
else
{
nCount++;
}
}
m_nCount = nCount;
UpdateData(FALSE);
Sleep(5000);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
m_bRUN = TRUE;
}

˵Ã÷£ºµ±m_bRUNһֱΪTRUEµÄʱºò£¬³ÌÐòÒ»Ö±´´½¨Ị̈߳¬Ö±ÖÁ´´½¨µÄÏ̵߳½´ï×î´óÖµ¡£

Ö´Ðнá¹û£º

¶àÏß³ÌʵÀýÎå

´ËʵÀýÑÝʾ£¬´´½¨ÁËÒ»¸öÏß³ÌÀ࣬Ïß³ÌÀà¼Ì³Ð×ÔCWinThread¡£Ö÷Ïß³Ìͨ¹ýAfxBeginThreadº¯Êýµ÷ÓÃÏß³ÌÀà¡£

Ö÷Ï̵߳÷ÓÃÏß³ÌÀࣺ

void CMthread6Dlg::OnUiThread()   
{
// TODO: Add your control notification handler code here
CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(CUIThread));
}

Ïß³ÌÀࣺ

Í·ÎļþÖÐÀඨÒ壺

class CMthread6Dlg : public CDialog

Ïß³ÌÀࣺ

// UIThread.cpp : implementation file  
//

#include "stdafx.h"
#include "Mthread6.h"
#include "UIThread.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CUIThread

IMPLEMENT_DYNCREATE(CUIThread, CWinThread)

CUIThread::CUIThread()
{
}

CUIThread::~CUIThread()
{
}

BOOL CUIThread::InitInstance()
{
// TODO: perform and per-thread initialization here
m_dlg.Create(IDD_UITHREADDLG);
m_dlg.ShowWindow(SW_SHOW);
m_pMainWnd = &m_dlg;
return TRUE;
}

int CUIThread::ExitInstance()
{
// TODO: perform any per-thread cleanup here
m_dlg.DestroyWindow();
return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CUIThread, CWinThread)
//{{AFX_MSG_MAP(CUIThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUIThread message handlers

´ÓÉϱߵĴúÂëÖУ¬×Ô½¨µÄÏß³ÌÀàCUIThreadÖØÐ´ÁËCWinThreadÀàµÄInitInstanceºÍExitInstanceº¯Êý

InitInstanceº¯ÊýÖУ¬´´½¨ÁËÒ»¸ö¶Ô»°¿ò¡£

ÔËÐнá¹û£º

   
3895 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ