///Do a modular part of the task. For example, if the task is to load the entire file, load one BlockFile. ///Relies on DoSomeInternal(), which is the subclasses must implement. ///@param amountWork the percent amount of the total job to do. 1.0 represents the entire job. the default of 0.0 /// will do the smallest unit of work possible void ODTask::DoSome(float amountWork) { mBlockUntilTerminateMutex.Lock(); printf("%s %i subtask starting on new thread with priority\n", GetTaskName(),GetTaskNumber()); mDoingTask=mTaskStarted=true; float workUntil = amountWork+PercentComplete(); if(workUntil<PercentComplete()) workUntil = PercentComplete(); //check periodically to see if we should exit. mTerminateMutex.Lock(); if(mTerminate) { mBlockUntilTerminateMutex.Unlock(); mTerminateMutex.Unlock(); return; } mTerminateMutex.Unlock(); Update(); //Do Some of the task. mTerminateMutex.Lock(); while(PercentComplete() < workUntil && PercentComplete() < 1.0 && !mTerminate) { wxThread::This()->Yield(); //release within the loop so we can cut the number of iterations short mTerminateMutex.Unlock(); //TODO: check to see if ondemand has been called if(false) ODUpdate(); DoSomeInternal(); //But add the mutex lock back before we check the value again. mTerminateMutex.Lock(); } mTerminateMutex.Unlock(); mDoingTask=false; mTerminateMutex.Lock(); //if it is not done, put it back onto the ODManager queue. if(!IsComplete() && !mTerminate) { ODManager::Instance()->AddTask(this); printf("%s %i is %f done\n", GetTaskName(),GetTaskNumber(),PercentComplete()); } else { printf("%s %i complete\n", GetTaskName(),GetTaskNumber()); } mTerminateMutex.Unlock(); mBlockUntilTerminateMutex.Unlock(); }
///Do a modular part of the task. For example, if the task is to load the entire file, load one BlockFile. ///Relies on DoSomeInternal(), which is the subclasses must implement. ///@param amountWork the percent amount of the total job to do. 1.0 represents the entire job. the default of 0.0 /// will do the smallest unit of work possible void ODTask::DoSome(float amountWork) { SetIsRunning(true); mBlockUntilTerminateMutex.Lock(); // printf("%s %i subtask starting on new thread with priority\n", GetTaskName(),GetTaskNumber()); mDoingTask=mTaskStarted=true; float workUntil = amountWork+PercentComplete(); //check periodically to see if we should exit. mTerminateMutex.Lock(); if(mTerminate) { mTerminateMutex.Unlock(); SetIsRunning(false); mBlockUntilTerminateMutex.Unlock(); return; } mTerminateMutex.Unlock(); Update(); if(UsesCustomWorkUntilPercentage()) workUntil = ComputeNextWorkUntilPercentageComplete(); if(workUntil<PercentComplete()) workUntil = PercentComplete(); //Do Some of the task. mTerminateMutex.Lock(); while(PercentComplete() < workUntil && PercentComplete() < 1.0 && !mTerminate) { wxThread::This()->Yield(); //release within the loop so we can cut the number of iterations short DoSomeInternal(); //keep the terminate mutex on so we don't remo mTerminateMutex.Unlock(); //check to see if ondemand has been called if(GetNeedsODUpdate() && PercentComplete() < 1.0) ODUpdate(); //But add the mutex lock back before we check the value again. mTerminateMutex.Lock(); } mTerminateMutex.Unlock(); mDoingTask=false; mTerminateMutex.Lock(); //if it is not done, put it back onto the ODManager queue. if(PercentComplete() < 1.0&& !mTerminate) { ODManager::Instance()->AddTask(this); //we did a bit of progress - we should allow a resave. AudacityProject::AllProjectsDeleteLock(); for(unsigned i=0; i<gAudacityProjects.GetCount(); i++) { if(IsTaskAssociatedWithProject(gAudacityProjects[i])) { //mark the changes so that the project can be resaved. gAudacityProjects[i]->GetUndoManager()->SetODChangesFlag(); break; } } AudacityProject::AllProjectsDeleteUnlock(); // printf("%s %i is %f done\n", GetTaskName(),GetTaskNumber(),PercentComplete()); } else { //for profiling, uncomment and look in audacity.app/exe's folder for AudacityProfile.txt //static int tempLog =0; //if(++tempLog % 5==0) //END_TASK_PROFILING("On Demand Drag and Drop 5 80 mb files into audacity, 5 wavs per task"); //END_TASK_PROFILING("On Demand open an 80 mb wav stereo file"); wxCommandEvent event( EVT_ODTASK_COMPLETE ); AudacityProject::AllProjectsDeleteLock(); for(unsigned i=0; i<gAudacityProjects.GetCount(); i++) { if(IsTaskAssociatedWithProject(gAudacityProjects[i])) { //this assumes tasks are only associated with one project. gAudacityProjects[i]->GetEventHandler()->AddPendingEvent(event); //mark the changes so that the project can be resaved. gAudacityProjects[i]->GetUndoManager()->SetODChangesFlag(); break; } } AudacityProject::AllProjectsDeleteUnlock(); // printf("%s %i complete\n", GetTaskName(),GetTaskNumber()); } mTerminateMutex.Unlock(); SetIsRunning(false); mBlockUntilTerminateMutex.Unlock(); }