📄 threads.cpp
字号:
// threads.cpp : implementation file
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
//
// This sample application is derived from the Mutex application
// distributed with Jeffrey Richter's "Advanced Windows" programming book
// (Microsoft Press). See the book for more information about Win32
// programming topics, including thread synchronization.
#include "stdafx.h"
#include "mutexes.h"
#include "mutexdlg.h"
#include "threads.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CExampleThread, CWinThread)
CExampleThread::CExampleThread()
{
m_bDone = FALSE;
m_pOwner = NULL;
m_bAutoDelete = FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CCounterThread
IMPLEMENT_DYNCREATE(CCounterThread, CExampleThread)
CCounterThread::CCounterThread()
{
}
CCounterThread::~CCounterThread()
{
}
BOOL CCounterThread::InitInstance()
{
// TODO: perform and per-thread initialization here
return TRUE;
}
int CCounterThread::Run()
{
BOOL fSyncChecked;
unsigned int nNumber;
if (m_pOwner == NULL)
return -1;
CSingleLock sLock(&(m_pOwner->m_mutex));
while (!m_bDone)
{
// Get the status of the Synchronize
// check box and save it.
fSyncChecked = m_pOwner->IsDlgButtonChecked(IDC_SYNCHRONIZE);
// If the user wants us synchronized, do it!
if (fSyncChecked)
sLock.Lock();
_stscanf((LPCTSTR) m_pOwner->m_strNumber, _T("%d"), &nNumber);
nNumber++;
m_pOwner->m_strNumber.Empty();
while (nNumber != 0)
{
m_pOwner->m_strNumber += (TCHAR) ('0' + nNumber%10);
// A call to Sleep() here tells the system that we want
// to relinquis the remainder of our time slice to
// another thread. this call is needed for
// single-CPU systems so that the results of the
// synchronization or lack thereof are obvious.
// Normally, your programs would NOT call Sleep() here.
Sleep(0);
// get ready to get the next digit.
nNumber /= 10;
}
// Characters were generated in reverse order,
// reverse the string
m_pOwner->m_strNumber.MakeReverse();
if (fSyncChecked)
{
// If the user wants synchronization, do it.
sLock.Unlock();
}
// If the user wants to display something
// after each iteration, do it.
if (m_pOwner->IsDlgButtonChecked(IDC_SHOWCNTRTHRD))
m_pOwner->AddToListBox(_T("Cntr: Increment"));
}
m_pOwner->PostMessage(WM_CLOSE, 0, 0L);
return 0;
}
BEGIN_MESSAGE_MAP(CCounterThread, CWinThread)
//{{AFX_MSG_MAP(CCounterThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCounterThread message handlers
/////////////////////////////////////////////////////////////////////////////
// CDisplayThread
IMPLEMENT_DYNCREATE(CDisplayThread, CExampleThread)
CDisplayThread::CDisplayThread()
{
}
CDisplayThread::~CDisplayThread()
{
}
BOOL CDisplayThread::InitInstance()
{
// TODO: perform and per-thread initialization here
return TRUE;
}
int CDisplayThread::Run()
{
BOOL fSyncChecked;
CString strBuffer;
ASSERT(m_pOwner != NULL);
if (m_pOwner == NULL)
return -1;
CSingleLock sLock(&(m_pOwner->m_mutex));
while (!m_bDone)
{
// Determine whether the user wants the threads
// to be synchronized.
fSyncChecked = m_pOwner->IsDlgButtonChecked(IDC_SYNCHRONIZE);
if (fSyncChecked)
sLock.Lock();
// Construct a string with the string form of the number.
strBuffer = _T("Dspy: ");
strBuffer += m_pOwner->m_strNumber;
if (fSyncChecked)
sLock.Unlock();
// Add the string form of the number to the list box.
m_pOwner->AddToListBox(strBuffer);
}
m_pOwner->PostMessage(WM_CLOSE, 0, 0L);
return 0;
}
BEGIN_MESSAGE_MAP(CDisplayThread, CWinThread)
//{{AFX_MSG_MAP(CDisplayThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDisplayThread message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -