concurrent run will crash application

This commit is contained in:
Xiao YiFang 2022-06-19 20:24:34 +08:00
parent 6ff042d56f
commit bd02d65ecc
5 changed files with 41 additions and 11 deletions

12
dsl.cc
View file

@ -56,6 +56,8 @@
// For SVG handling
#include <QtSvg/QSvgRenderer>
#include <QtConcurrent>
#include "utils.hh"
namespace Dsl {
@ -1561,6 +1563,7 @@ class DslArticleRequest: public Dictionary::DataRequest
QAtomicInt isCancelled;
QSemaphore hasExited;
QFuture< void > f;
public:
@ -1569,7 +1572,8 @@ public:
DslDictionary & dict_, bool ignoreDiacritics_ ):
word( word_ ), alts( alts_ ), dict( dict_ ), ignoreDiacritics( ignoreDiacritics_ )
{
QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
}
void run();
@ -1582,6 +1586,7 @@ public:
~DslArticleRequest()
{
isCancelled.ref();
f.waitForFinished();
//hasExited.acquire();
}
};
@ -1733,6 +1738,7 @@ class DslResourceRequest: public Dictionary::DataRequest
QAtomicInt isCancelled;
QSemaphore hasExited;
QFuture< void > f;
public:
@ -1741,7 +1747,8 @@ public:
dict( dict_ ),
resourceName( resourceName_ )
{
QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
}
void run();
@ -1754,6 +1761,7 @@ public:
~DslResourceRequest()
{
isCancelled.ref();
f.waitForFinished();
//hasExited.acquire();
}
};

View file

@ -10,6 +10,7 @@
#include <QSemaphore>
#include <map>
#include <QtConcurrent>
#include <set>
#include <string>
@ -461,6 +462,7 @@ class EpwingArticleRequest: public Dictionary::DataRequest
QAtomicInt isCancelled;
QSemaphore hasExited;
QFuture< void > f;
public:
@ -469,8 +471,9 @@ public:
EpwingDictionary & dict_, bool ignoreDiacritics_ ):
word( word_ ), alts( alts_ ), dict( dict_ ), ignoreDiacritics( ignoreDiacritics_ )
{
QThreadPool::globalInstance()->start(
new EpwingArticleRequestRunnable( *this, hasExited ) );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start(
// new EpwingArticleRequestRunnable( *this, hasExited ) );
}
void run(); // Run from another thread by EpwingArticleRequestRunnable
@ -483,7 +486,8 @@ public:
~EpwingArticleRequest()
{
isCancelled.ref();
hasExited.acquire();
f.waitForFinished();
// hasExited.acquire();
}
};

View file

@ -10,6 +10,7 @@
#include <QRunnable>
#include <QSemaphore>
#include <QList>
#include <QtConcurrent>
#include "dictionary.hh"
#include "btreeidx.hh"
@ -83,6 +84,7 @@ class FTSResultsRequest : public Dictionary::DataRequest
QAtomicInt isCancelled;
QAtomicInt results;
QFuture< void > f;
QList< FTS::FtsHeadword > * foundHeadwords;
@ -135,7 +137,8 @@ public:
foundHeadwords = new QList< FTS::FtsHeadword >;
results = 0;
QThreadPool::globalInstance()->start( [ this ]() { this->run(); }, -100 );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start( [ this ]() { this->run(); }, -100 );
}
void run();
@ -148,6 +151,7 @@ public:
~FTSResultsRequest()
{
isCancelled.ref();
f.waitForFinished();
if( foundHeadwords )
delete foundHeadwords;
}

13
mdx.cc
View file

@ -43,6 +43,7 @@
#include "tiff.hh"
#include "utils.hh"
#include "base/globalregex.hh"
#include <QtConcurrent>
namespace Mdx
{
@ -533,6 +534,7 @@ class MdxArticleRequest: public Dictionary::DataRequest
QAtomicInt isCancelled;
QSemaphore hasExited;
QFuture< void > f;
public:
@ -545,7 +547,8 @@ public:
dict( dict_ ),
ignoreDiacritics( ignoreDiacritics_ )
{
QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start( );
}
void run();
@ -558,7 +561,8 @@ public:
~MdxArticleRequest()
{
isCancelled.ref();
//hasExited.acquire();
f.waitForFinished();
// hasExited.acquire();
}
};
@ -687,6 +691,7 @@ class MddResourceRequest: public Dictionary::DataRequest
wstring resourceName;
QAtomicInt isCancelled;
QSemaphore hasExited;
QFuture< void > f;
public:
@ -695,7 +700,8 @@ public:
dict( dict_ ),
resourceName( Utf8::decode( resourceName_ ) )
{
QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
}
void run();
@ -708,6 +714,7 @@ public:
~MddResourceRequest()
{
isCancelled.ref();
f.waitForFinished();
//hasExited.acquire();
}
};

11
zim.cc
View file

@ -41,6 +41,7 @@
#include <set>
#include <map>
#include <algorithm>
#include <QtConcurrent>
namespace Zim {
@ -1248,6 +1249,7 @@ class ZimArticleRequest: public Dictionary::DataRequest
QAtomicInt isCancelled;
QSemaphore hasExited;
QFuture< void > f;
public:
@ -1256,7 +1258,8 @@ public:
ZimDictionary & dict_, bool ignoreDiacritics_ ):
word( word_ ), alts( alts_ ), dict( dict_ ), ignoreDiacritics( ignoreDiacritics_ )
{
QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
}
void run();
@ -1269,6 +1272,7 @@ public:
~ZimArticleRequest()
{
isCancelled.ref();
f.waitForFinished();
//hasExited.acquire();
}
};
@ -1421,11 +1425,13 @@ class ZimResourceRequest: public Dictionary::DataRequest
QAtomicInt isCancelled;
QSemaphore hasExited;
QFuture< void > f;
public:
ZimResourceRequest(ZimDictionary &dict_, string const &resourceName_)
: dict(dict_), resourceName(resourceName_) {
QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
f = QtConcurrent::run( [ this ]() { this->run(); } );
// QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
}
void run();
@ -1438,6 +1444,7 @@ public:
~ZimResourceRequest()
{
isCancelled.ref();
f.waitForFinished();
//hasExited.acquire();
}
};