home *** CD-ROM | disk | FTP | other *** search
- // calcthrd.cpp : implementation of the worker thread
- //
- // 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.
-
- #include "stdafx.h"
- #include "calcthrd.h"
- #include "recaldoc.h"
- #include "slowcalc.h"
- #include "mtrecalc.h"
-
- UINT RecalcThreadProc(LPVOID pParam)
- {
- CRecalcThreadInfo* pRecalcInfo = (CRecalcThreadInfo*)pParam;
-
- // This recalc thread runs in an infinite loop, waiting to recalculate the
- // result whenever the main application thread sets the "start recalc" event.
- // The recalc thread exits the loop only when the main application sets the
- // "kill recalc" event.
-
- BOOL bRecalcCompleted;
- while (TRUE)
- {
- bRecalcCompleted = FALSE;
-
- // Wait until the main application thread asks this thread to do
- // another calculation.
- if (WaitForSingleObject(pRecalcInfo->m_hEventStartRecalc, INFINITE)
- != WAIT_OBJECT_0)
- break;
-
- // Exit the thread if the main application sets the "kill recalc"
- // event. The main application will set the "start recalc" event
- // before setting the "kill recalc" event.
-
- if (WaitForSingleObject(pRecalcInfo->m_hEventKillRecalcThread, 0)
- == WAIT_OBJECT_0)
- break; // Terminate this thread by existing the proc.
-
- // Reset event to indicate "not done", that is, recalculation is in progress.
- ResetEvent(pRecalcInfo->m_hEventRecalcDone);
-
- bRecalcCompleted = SlowAdd(pRecalcInfo->m_nInt1,
- pRecalcInfo->m_nInt2,
- pRecalcInfo->m_nSum,
- pRecalcInfo,
- pRecalcInfo->m_nRecalcSpeedSeconds,
- pRecalcInfo->m_hwndNotifyProgress);
-
- // Set event to indicate that recalculation is done (i.e., no longer in progres),
- // even if perhaps interrupted by "kill recalc" event detected in the SlowAdd function.
- SetEvent(pRecalcInfo->m_hEventRecalcDone);
-
- if (!bRecalcCompleted) // If interrupted by kill then...
- break; // terminate this thread by exiting the proc.
-
- ::PostMessage(pRecalcInfo->m_hwndNotifyRecalcDone,
- WM_USER_RECALC_DONE, 0, 0);
- }
-
- if (!bRecalcCompleted)
- SetEvent(pRecalcInfo->m_hEventRecalcThreadKilled);
-
- return 0;
- }
-