/** Used by the shared_ptr instead of the private destructor.
*/ class TimerBasedTaskExecution::Deleter
{ public: voidoperator() (TimerBasedTaskExecution* pObject)
{ delete pObject;
}
};
std::shared_ptr<TimerBasedTaskExecution> TimerBasedTaskExecution::Create ( const std::shared_ptr<AsynchronousTask>& rpTask,
sal_uInt32 nMillisecondsBetweenSteps,
sal_uInt32 nMaxTimePerStep)
{
std::shared_ptr<TimerBasedTaskExecution> pExecution( new TimerBasedTaskExecution(rpTask,nMillisecondsBetweenSteps,nMaxTimePerStep),
Deleter()); // Let the new object have a shared_ptr to itself, so that it can // release itself when the AsynchronousTask has been executed // completely. if (pExecution->mpTask != nullptr)
pExecution->mpSelf = pExecution; return pExecution;
}
try
{
std::shared_ptr<tools::TimerBasedTaskExecution> pExecution (rpExecution);
pExecution->Release();
} catch (const std::bad_weak_ptr&)
{ // When a bad_weak_ptr has been thrown then the object pointed // to by rpTask has been released right after we checked that it // still existed. Too bad, but that means, that we have nothing // more do.
}
}
if (mpTask->HasNextStep())
{ // Execute as many steps as fit into the time span of length // mnMaxTimePerStep. Note that the last step may take longer // than allowed.
sal_uInt32 nStartTime (::tools::Time( ::tools::Time::SYSTEM ).GetMSFromTime());
SAL_INFO("sd.tools", __func__ << ": starting TimerBasedTaskExecution at " << nStartTime); do
{
mpTask->RunNextStep();
sal_uInt32 nDuration (::tools::Time( ::tools::Time::SYSTEM ).GetMSFromTime()-nStartTime);
SAL_INFO("sd.tools", __func__ << ": executed step in " << nDuration); if (nDuration > mnMaxTimePerStep) break;
} while (mpTask->HasNextStep());
SAL_INFO("sd.tools", __func__ << ": TimerBasedTaskExecution sleeping");
maTimer.Start();
} else
mpSelf.reset();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.