render: improved threading stability
This commit is contained in:
@@ -48,39 +48,91 @@ public:
|
||||
job_time_ = QDateTime::currentMSecsSinceEpoch();
|
||||
}
|
||||
|
||||
void WaitForFinished();
|
||||
/**
|
||||
* @brief Get the ticket's current state
|
||||
*
|
||||
* This function is thread safe, unless `lock` is set to false. Then the caller has responsibility
|
||||
* of locking the mutex before and unlocking after this function is called.
|
||||
*/
|
||||
bool IsRunning(bool lock = true);
|
||||
|
||||
/**
|
||||
* @brief Determine how many times ticket has been finished
|
||||
*
|
||||
* This function is thread safe, unless `lock` is set to false. Then the caller has responsibility
|
||||
* of locking the mutex before and unlocking after this function is called.
|
||||
*/
|
||||
int GetFinishCount(bool lock = true);
|
||||
|
||||
/**
|
||||
* @brief Check if this ticket has a result
|
||||
*
|
||||
* If this ticket is running, this will always return false.
|
||||
*/
|
||||
bool HasResult();
|
||||
|
||||
/**
|
||||
* @brief Get value, if any
|
||||
*/
|
||||
QVariant Get();
|
||||
|
||||
bool HasStarted();
|
||||
|
||||
bool IsFinished(bool lock = true);
|
||||
|
||||
bool WasCancelled();
|
||||
/**
|
||||
* @brief Wait for ticket to be finished
|
||||
*
|
||||
* If this ticket is not running, this function returns immediately.
|
||||
*/
|
||||
void WaitForFinished();
|
||||
void WaitForFinished(QMutex* mutex);
|
||||
|
||||
/**
|
||||
* @brief Access this ticket's mutex
|
||||
*
|
||||
* Use if you're doing several operations on a ticket and need to ensure thread safety while
|
||||
* doing so. Most of the time this isn't necessary since all functions are thread safe by default.
|
||||
*/
|
||||
QMutex* lock()
|
||||
{
|
||||
return &lock_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Signal to the ticket that it is running
|
||||
*
|
||||
* If any value is set, it is cleared.
|
||||
*/
|
||||
void Start();
|
||||
|
||||
void Finish(QVariant result, bool cancelled);
|
||||
/**
|
||||
* @brief Finish ticket with no value
|
||||
*
|
||||
* Sets ticket to no longer running and assume it has received no result.
|
||||
*/
|
||||
void Finish();
|
||||
|
||||
void Cancel();
|
||||
/**
|
||||
* @brief Finish ticket with value
|
||||
*
|
||||
* Sets ticket to no longer running and provide a value generated by the operation requested.
|
||||
*/
|
||||
void Finish(QVariant result);
|
||||
|
||||
signals:
|
||||
/**
|
||||
* @brief Emitted when finish has been called by any means (either cancelled or with a result)
|
||||
*/
|
||||
void Finished();
|
||||
|
||||
private:
|
||||
bool started_;
|
||||
void FinishInternal(bool has_result, QVariant result);
|
||||
|
||||
bool finished_;
|
||||
|
||||
bool cancelled_;
|
||||
bool is_running_;
|
||||
|
||||
QVariant result_;
|
||||
|
||||
bool has_result_;
|
||||
|
||||
int finish_count_;
|
||||
|
||||
QMutex lock_;
|
||||
|
||||
QWaitCondition wait_;
|
||||
|
||||
Reference in New Issue
Block a user