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

|