29
using namespace qpdfview;
37
void setCancellation(QAtomicInt& wasCanceled)
39
#if QT_VERSION > QT_VERSION_CHECK(5,0,0)
41
wasCanceled.storeRelease(Canceled);
45
wasCanceled.fetchAndStoreRelease(Canceled);
50
void resetCancellation(QAtomicInt& wasCanceled)
52
#if QT_VERSION > QT_VERSION_CHECK(5,0,0)
54
wasCanceled.storeRelease(NotCanceled);
58
wasCanceled.fetchAndStoreRelease(NotCanceled);
63
bool testCancellation(QAtomicInt& wasCanceled)
65
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
67
return wasCanceled.load() != NotCanceled;
71
return !wasCanceled.testAndSetRelaxed(NotCanceled, NotCanceled);
76
int loadWasCanceled(const QAtomicInt& wasCanceled)
78
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
80
return wasCanceled.load();
89
void releaseProgress(QAtomicInt& progress, int value)
91
#if QT_VERSION > QT_VERSION_CHECK(5,0,0)
93
progress.storeRelease(value);
97
progress.fetchAndStoreRelease(value);
102
int acquireProgress(QAtomicInt& progress)
104
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
106
return progress.loadAcquire();
110
return progress.fetchAndAddAcquire(0);
115
int loadProgress(const QAtomicInt& progress)
117
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
119
return progress.load();
26
129
namespace qpdfview
29
132
SearchTask::SearchTask(QObject* parent) : QThread(parent),
133
m_wasCanceled(NotCanceled),
39
142
bool SearchTask::wasCanceled() const
144
return loadWasCanceled(m_wasCanceled) != NotCanceled;
44
147
int SearchTask::progress() const
149
return acquireProgress(m_progress);
49
152
void SearchTask::run()
51
154
for(int index = m_beginAtPage - 1; index < m_pages.count() + m_beginAtPage - 1; ++index)
156
if(testCancellation(m_wasCanceled))
60
161
const QList< QRectF > results = m_pages.at(index % m_pages.count())->search(m_text, m_matchCase);
62
163
emit resultsReady(index % m_pages.count(), results);
64
m_progress = 100 * (index - m_beginAtPage)/ m_pages.count();
165
releaseProgress(m_progress, 100 * (index + 1 - m_beginAtPage + 1) / m_pages.count());
66
emit progressChanged(m_progress);
167
emit progressChanged(loadProgress(m_progress));
170
releaseProgress(m_progress, 0);
72
void SearchTask::start(const QVector< Model::Page* >& pages, const QString& text, bool matchCase, int beginAtPage)
173
void SearchTask::start(const QVector< Model::Page* >& pages,
174
const QString& text, bool matchCase, int beginAtPage)
77
179
m_matchCase = matchCase;
78
180
m_beginAtPage = beginAtPage;
80
m_wasCanceled = false;
182
resetCancellation(m_wasCanceled);
183
releaseProgress(m_progress, 0);
86
188
void SearchTask::cancel()
190
setCancellation(m_wasCanceled);