#include #include #include #include #include #include #include #include #include #include DWORD CalcThread::threadHandler(ThreadMessage &someThreadMessage) { switch(someThreadMessage.message()) { case ThreadMessage::TM_CREATE : break; case ThreadMessage::TM_DESTROY : break; case ThreadMessage::TM_USER : if(someThreadMessage.userDataOne()==CalcStart) { mCalcMutex.requestMutex(); performCalc(*(CalcDlg*)someThreadMessage.userDataTwo()); mCalcMutex.releaseMutex(); } break; } return FALSE; } void CalcThread::startCalc(CalcDlg &calcDlg) { mIsInReset=TRUE; mCalcMutex.requestMutex(); mIsInReset=FALSE; ThreadMessage startMessage(ThreadMessage::TM_USER,CalcThread::CalcStart,(DWORD)&calcDlg); postMessage(startMessage); mCalcMutex.releaseMutex(); } void CalcThread::performCalc(CalcDlg &calcDlg) { Block cashFlows; PurePassThru passThru; CashFlow cashFlow; String trmString; String prnString; String cpnString; size_t numFlows; calcDlg.getText(CALC_TERM,trmString); calcDlg.getText(CALC_PRINCIPAL,prnString); calcDlg.getText(CALC_COUPON,cpnString); if(trmString.isNull()||prnString.isNull()||cpnString.isNull()){::MessageBeep(0);return;} passThru.issBal(::atof((LPSTR)prnString)); passThru.wac(::atof((LPSTR)cpnString)); passThru.coupon(::atof((LPSTR)cpnString)); passThru.wam(::atol((LPSTR)trmString)); passThru.origTerm(::atol((LPSTR)trmString)); passThru.psa(0.00); if(calcDlg.mPrePay.amount())cashFlow.generateCashFlows(passThru,cashFlows,calcDlg.mPrePay); else cashFlow.generateCashFlows(passThru,cashFlows); calcDlg.mlpGraphWindow->showFlows(cashFlows,::atol((LPSTR)trmString)); numFlows=cashFlows.size(); calcDlg.mlpCalcSheet->clearData(); calcDlg.mlpCalcSheet->setCurrentCell(1,1); for(short itemIndex=0;itemIndex itemStrings; if(mIsInReset)break; cashFlows[itemIndex].itemStrings(itemStrings); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::IssBal,itemStrings[CalcDlg::IssBal]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::SMM,itemStrings[CalcDlg::SMM]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::MtgPay,itemStrings[CalcDlg::MtgPay]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::NetIntPay,itemStrings[CalcDlg::NetIntPay]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::GrossInt,itemStrings[CalcDlg::GrossInt]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::SchPrn,itemStrings[CalcDlg::SchPrn]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::Prepay,itemStrings[CalcDlg::Prepay]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::TotPrin,itemStrings[CalcDlg::TotPrin]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::Cashflow,itemStrings[CalcDlg::Cashflow]); calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::Factor,itemStrings[CalcDlg::Factor]); } ::SetFocus(calcDlg.mlpCalcSheet->getHandle()); return; }