|
|
1.1 ! root 1: /*--------------------------------------------------------------- ! 2: BIGJOB4.C -- Second thread approach to lengthy processing job ! 3: ----------------------------------------------------------------*/ ! 4: ! 5: #define INCL_WIN ! 6: #define INCL_DOS ! 7: #include <os2.h> ! 8: #include <mt\process.h> ! 9: #include <mt\stdlib.h> ! 10: #include "bigjob.h" ! 11: ! 12: VOID _CDECL FAR CalcThread (PCALCPARAM) ; ! 13: ! 14: HAB hab ; ! 15: ! 16: int main (void) ! 17: { ! 18: static CHAR szClientClass [] = "BigJob4" ; ! 19: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | ! 20: FCF_SIZEBORDER | FCF_MINMAX | ! 21: FCF_SHELLPOSITION | FCF_TASKLIST | ! 22: FCF_MENU ; ! 23: HMQ hmq ; ! 24: HWND hwndFrame, hwndClient ; ! 25: QMSG qmsg ; ! 26: ! 27: hab = WinInitialize (0) ; ! 28: hmq = WinCreateMsgQueue (hab, 0) ; ! 29: ! 30: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ; ! 31: ! 32: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE, ! 33: &flFrameFlags, szClientClass, ! 34: " - A Second Thread", ! 35: 0L, NULL, ID_RESOURCE, &hwndClient) ; ! 36: ! 37: WinSendMsg (hwndFrame, WM_SETICON, ! 38: WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE), ! 39: NULL) ; ! 40: ! 41: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 42: WinDispatchMsg (hab, &qmsg) ; ! 43: ! 44: WinDestroyWindow (hwndFrame) ; ! 45: WinDestroyMsgQueue (hmq) ; ! 46: WinTerminate (hab) ; ! 47: return 0 ; ! 48: } ! 49: ! 50: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 51: { ! 52: static CALCPARAM cp ; ! 53: static LONG lRepAmts [] = { 10, 100, 1000, 10000, 100000 } ; ! 54: static SHORT sCurrentRep = IDM_10 ; ! 55: static SHORT sStatus = STATUS_READY ; ! 56: static TID tidCalc ; ! 57: static ULONG ulElapsedTime ; ! 58: static VOID *pThreadStack ; ! 59: ! 60: switch (msg) ! 61: { ! 62: case WM_COMMAND: ! 63: switch (COMMANDMSG(&msg)->cmd) ! 64: { ! 65: case IDM_10: ! 66: case IDM_100: ! 67: case IDM_1000: ! 68: case IDM_10000: ! 69: case IDM_100000: ! 70: CheckMenuItem (hwnd, sCurrentRep, FALSE) ; ! 71: sCurrentRep = COMMANDMSG(&msg)->cmd ; ! 72: CheckMenuItem (hwnd, sCurrentRep, TRUE) ; ! 73: return 0 ; ! 74: ! 75: case IDM_START: ! 76: if (NULL == (pThreadStack = malloc (STACKSIZE))) ! 77: { ! 78: WinAlarm (HWND_DESKTOP, WA_ERROR) ; ! 79: return 0 ; ! 80: } ! 81: ! 82: cp.hwnd = hwnd ; ! 83: cp.lCalcRep = lRepAmts [sCurrentRep - IDM_10] ; ! 84: cp.fContinueCalc = TRUE ; ! 85: ! 86: if (-1 == (tidCalc = _beginthread (CalcThread, ! 87: pThreadStack, STACKSIZE, &cp))) ! 88: { ! 89: free (pThreadStack) ; ! 90: WinAlarm (HWND_DESKTOP, WA_ERROR) ; ! 91: return 0 ; ! 92: } ! 93: ! 94: sStatus = STATUS_WORKING ; ! 95: WinInvalidateRect (hwnd, NULL, FALSE) ; ! 96: EnableMenuItem (hwnd, IDM_START, FALSE) ; ! 97: EnableMenuItem (hwnd, IDM_ABORT, TRUE) ; ! 98: return 0 ; ! 99: ! 100: case IDM_ABORT: ! 101: cp.fContinueCalc = FALSE ; ! 102: EnableMenuItem (hwnd, IDM_ABORT, FALSE) ; ! 103: return 0 ; ! 104: } ! 105: break ; ! 106: ! 107: case WM_CALC_DONE: ! 108: sStatus = STATUS_DONE ; ! 109: ulElapsedTime = LONGFROMMP (mp1) ; ! 110: WinInvalidateRect (hwnd, NULL, FALSE) ; ! 111: EnableMenuItem (hwnd, IDM_START, TRUE) ; ! 112: EnableMenuItem (hwnd, IDM_ABORT, FALSE) ; ! 113: free (pThreadStack) ; ! 114: return 0 ; ! 115: ! 116: case WM_CALC_ABORTED: ! 117: sStatus = STATUS_READY ; ! 118: WinInvalidateRect (hwnd, NULL, FALSE) ; ! 119: EnableMenuItem (hwnd, IDM_START, TRUE) ; ! 120: free (pThreadStack) ; ! 121: return 0 ; ! 122: ! 123: case WM_PAINT: ! 124: PaintWindow (hwnd, sStatus, cp.lCalcRep, ulElapsedTime) ; ! 125: return 0 ; ! 126: ! 127: case WM_DESTROY: ! 128: if (sStatus = STATUS_WORKING) ! 129: DosSuspendThread (tidCalc) ; ! 130: return 0 ; ! 131: } ! 132: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 133: } ! 134: ! 135: VOID _CDECL FAR CalcThread (PCALCPARAM pcp) ! 136: { ! 137: double A ; ! 138: LONG lRep, lTime ; ! 139: ! 140: lTime = WinGetCurrentTime (hab) ; ! 141: ! 142: for (A = 1.0, lRep = 0 ; lRep < pcp->lCalcRep && ! 143: pcp->fContinueCalc ; lRep++) ! 144: A = Savage (A) ; ! 145: ! 146: DosEnterCritSec () ; // So thread is dead when message retrieved ! 147: ! 148: if (pcp->fContinueCalc) ! 149: { ! 150: lTime = WinGetCurrentTime (hab) - lTime ; ! 151: WinPostMsg (pcp->hwnd, WM_CALC_DONE, MPFROMLONG (lTime), NULL) ; ! 152: } ! 153: else ! 154: WinPostMsg (pcp->hwnd, WM_CALC_ABORTED, NULL, NULL) ; ! 155: ! 156: _endthread () ; ! 157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.