public void ClosestApproachAsync(CorrectionData correctionData, CalcCallback calcCallback) { correctionData.gravityState.isAsync = true; this.calcCallback = calcCallback; calcState = CalcState.CLOSEST_APPROACH; // setup Mutex threadCountMutex.WaitOne(); threadsPending++; threadCountMutex.ReleaseMutex(); System.Threading.ThreadPool.QueueUserWorkItem( new System.Threading.WaitCallback(CalcCorrectionThread), new object[] { correctionData, CreateUnityAdapter(), (JobResultHandler)CalcResultHandler }); }
public string CorrectionCalcAsync(double targetDistance, double targetAccuracy, double approachDistance, double maxTime, CalcCallback calcCallback) { this.calcCallback = calcCallback; double[] corrections = { -0.001, 0, 0.001 }; this.targetDistance = targetDistance; this.targetAccuracy = targetAccuracy; threadsPending = 0; calcState = CalcState.NOT_STARTED; string s = ""; GravityEngine ge = GravityEngine.Instance(); correctionData = new CorrectionData[corrections.Length]; int i = 0; foreach (double correction in corrections) { // Run each computation as a dedicated thread correctionData[i] = new CorrectionData(); correctionData[i].gravityState = ge.GetGravityStateCopy(); correctionData[i].approachDistance = approachDistance; correctionData[i].maxPhysTime = maxTime; correctionData[i].correction = correction; threadCountMutex.WaitOne(); threadsPending++; threadCountMutex.ReleaseMutex(); System.Threading.ThreadPool.QueueUserWorkItem( new System.Threading.WaitCallback(CalcCorrectionThread), new object[] { correctionData[i], CreateUnityAdapter(), (JobResultHandler)CalcResultHandler }); i++; } calcState = CalcState.INITIAL_THREE; return(s); }