home *** CD-ROM | disk | FTP | other *** search
- // 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
-