mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-07-22 14:10:54 -04:00
Added threaded loading of channel posts.
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@7480 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
2d2e3881cf
commit
7a65ad1a14
9 changed files with 277 additions and 63 deletions
|
@ -19,6 +19,8 @@
|
|||
* Boston, MA 02110-1301, USA.
|
||||
****************************************************************/
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
#include "GxsMessageFramePostWidget.h"
|
||||
#include "GxsFeedItem.h"
|
||||
#include "gui/common/UIStateHelper.h"
|
||||
|
@ -34,6 +36,7 @@ GxsMessageFramePostWidget::GxsMessageFramePostWidget(RsGxsIfaceHelper *ifaceImpl
|
|||
|
||||
mSubscribeFlags = 0;
|
||||
mNextTokenType = 0;
|
||||
mFillThread = NULL;
|
||||
|
||||
mTokenTypeGroupData = nextTokenType();
|
||||
mTokenTypePosts = nextTokenType();
|
||||
|
@ -43,6 +46,15 @@ GxsMessageFramePostWidget::GxsMessageFramePostWidget(RsGxsIfaceHelper *ifaceImpl
|
|||
mStateHelper = new UIStateHelper(this);
|
||||
}
|
||||
|
||||
GxsMessageFramePostWidget::~GxsMessageFramePostWidget()
|
||||
{
|
||||
if (mFillThread) {
|
||||
mFillThread->stop(true);
|
||||
delete(mFillThread);
|
||||
mFillThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void GxsMessageFramePostWidget::setGroupId(const RsGxsGroupId &groupId)
|
||||
{
|
||||
if (mGroupId == groupId) {
|
||||
|
@ -116,6 +128,50 @@ void GxsMessageFramePostWidget::updateDisplay(bool complete)
|
|||
}
|
||||
}
|
||||
|
||||
void GxsMessageFramePostWidget::fillThreadAddPost(const QVariant &post, bool related, int current, int count)
|
||||
{
|
||||
if (sender() == mFillThread) {
|
||||
fillThreadCreatePost(post, related, current, count);
|
||||
}
|
||||
}
|
||||
|
||||
void GxsMessageFramePostWidget::fillThreadFinished()
|
||||
{
|
||||
#ifdef ENABLE_DEBUG
|
||||
std::cerr << "GxsMessageFramePostWidget::fillThreadFinished()" << std::endl;
|
||||
#endif
|
||||
|
||||
/* Thread has finished */
|
||||
GxsMessageFramePostThread *thread = dynamic_cast<GxsMessageFramePostThread*>(sender());
|
||||
if (thread) {
|
||||
if (thread == mFillThread) {
|
||||
/* Current thread has finished */
|
||||
mFillThread = NULL;
|
||||
|
||||
mStateHelper->setLoading(mTokenTypePosts, false);
|
||||
emit groupChanged(this);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DEBUG
|
||||
if (thread->stopped()) {
|
||||
// thread was stopped
|
||||
std::cerr << "GxsMessageFramePostWidget::fillThreadFinished() Thread was stopped" << std::endl;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DEBUG
|
||||
std::cerr << "GxsMessageFramePostWidget::fillThreadFinished() Delete thread" << std::endl;
|
||||
#endif
|
||||
|
||||
thread->deleteLater();
|
||||
thread = NULL;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DEBUG
|
||||
std::cerr << "GxsMessageFramePostWidget::fillThreadFinished done()" << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************/
|
||||
/** Request / Response of Data ********************************/
|
||||
/**************************************************************/
|
||||
|
@ -197,10 +253,20 @@ void GxsMessageFramePostWidget::requestPosts()
|
|||
#endif
|
||||
|
||||
/* Request all posts */
|
||||
clearPosts();
|
||||
|
||||
mTokenQueue->cancelActiveRequestTokens(mTokenTypePosts);
|
||||
|
||||
if (mFillThread) {
|
||||
/* Stop current fill thread */
|
||||
GxsMessageFramePostThread *thread = mFillThread;
|
||||
mFillThread = NULL;
|
||||
thread->stop(false);
|
||||
|
||||
mStateHelper->setLoading(mTokenTypePosts, false);
|
||||
}
|
||||
|
||||
clearPosts();
|
||||
|
||||
if (mGroupId.isNull()) {
|
||||
mStateHelper->setActive(mTokenTypePosts, false);
|
||||
mStateHelper->setLoading(mTokenTypePosts, false);
|
||||
|
@ -231,9 +297,26 @@ void GxsMessageFramePostWidget::loadPosts(const uint32_t &token)
|
|||
|
||||
mStateHelper->setActive(mTokenTypePosts, true);
|
||||
|
||||
insertPosts(token);
|
||||
if (useThread()) {
|
||||
/* Create fill thread */
|
||||
mFillThread = new GxsMessageFramePostThread(token, this);
|
||||
|
||||
// connect thread
|
||||
connect(mFillThread, SIGNAL(finished()), this, SLOT(fillThreadFinished()), Qt::BlockingQueuedConnection);
|
||||
connect(mFillThread, SIGNAL(addPost(QVariant,bool,int,int)), this, SLOT(fillThreadAddPost(QVariant,bool,int,int)), Qt::BlockingQueuedConnection);
|
||||
|
||||
#ifdef ENABLE_DEBUG
|
||||
std::cerr << "GxsMessageFramePostWidget::loadPosts() Start fill thread" << std::endl;
|
||||
#endif
|
||||
|
||||
/* Start thread */
|
||||
mFillThread->start();
|
||||
} else {
|
||||
insertPosts(token, NULL);
|
||||
|
||||
mStateHelper->setLoading(mTokenTypePosts, false);
|
||||
}
|
||||
|
||||
mStateHelper->setLoading(mTokenTypePosts, false);
|
||||
emit groupChanged(this);
|
||||
}
|
||||
|
||||
|
@ -247,9 +330,9 @@ void GxsMessageFramePostWidget::requestRelatedPosts(const std::vector<RsGxsMessa
|
|||
mTokenQueue->cancelActiveRequestTokens(mTokenTypeRelatedPosts);
|
||||
|
||||
if (mGroupId.isNull()) {
|
||||
mStateHelper->setActive(mTokenTypePosts, false);
|
||||
mStateHelper->setLoading(mTokenTypePosts, false);
|
||||
mStateHelper->clear(mTokenTypePosts);
|
||||
mStateHelper->setActive(mTokenTypeRelatedPosts, false);
|
||||
mStateHelper->setLoading(mTokenTypeRelatedPosts, false);
|
||||
mStateHelper->clear(mTokenTypeRelatedPosts);
|
||||
emit groupChanged(this);
|
||||
return;
|
||||
}
|
||||
|
@ -258,7 +341,7 @@ void GxsMessageFramePostWidget::requestRelatedPosts(const std::vector<RsGxsMessa
|
|||
return;
|
||||
}
|
||||
|
||||
mStateHelper->setLoading(mTokenTypePosts, true);
|
||||
mStateHelper->setLoading(mTokenTypeRelatedPosts, true);
|
||||
emit groupChanged(this);
|
||||
|
||||
RsTokReqOptions opts;
|
||||
|
@ -280,11 +363,11 @@ void GxsMessageFramePostWidget::loadRelatedPosts(const uint32_t &token)
|
|||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mStateHelper->setActive(mTokenTypePosts, true);
|
||||
mStateHelper->setActive(mTokenTypeRelatedPosts, true);
|
||||
|
||||
insertRelatedPosts(token);
|
||||
|
||||
mStateHelper->setLoading(mTokenTypePosts, false);
|
||||
mStateHelper->setLoading(mTokenTypeRelatedPosts, false);
|
||||
emit groupChanged(this);
|
||||
}
|
||||
|
||||
|
@ -309,3 +392,52 @@ void GxsMessageFramePostWidget::loadRequest(const TokenQueue *queue, const Token
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************/
|
||||
/** GxsMessageFramePostThread *********************************/
|
||||
/**************************************************************/
|
||||
|
||||
GxsMessageFramePostThread::GxsMessageFramePostThread(uint32_t token, GxsMessageFramePostWidget *parent)
|
||||
: QThread(parent), mToken(token), mParent(parent)
|
||||
{
|
||||
mStopped = false;
|
||||
}
|
||||
|
||||
GxsMessageFramePostThread::~GxsMessageFramePostThread()
|
||||
{
|
||||
#ifdef ENABLE_DEBUG
|
||||
std::cerr << "GxsMessageFramePostThread::~GxsMessageFramePostThread" << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
void GxsMessageFramePostThread::stop(bool waitForStop)
|
||||
{
|
||||
if (waitForStop) {
|
||||
disconnect();
|
||||
}
|
||||
|
||||
mStopped = true;
|
||||
QApplication::processEvents();
|
||||
|
||||
if (waitForStop) {
|
||||
wait();
|
||||
}
|
||||
}
|
||||
|
||||
void GxsMessageFramePostThread::run()
|
||||
{
|
||||
#ifdef ENABLE_DEBUG
|
||||
std::cerr << "GxsMessageFramePostThread::run()" << std::endl;
|
||||
#endif
|
||||
|
||||
mParent->insertPosts(mToken, this);
|
||||
|
||||
#ifdef ENABLE_DEBUG
|
||||
std::cerr << "GxsMessageFramePostThread::run() stopped: " << (stopped() ? "yes" : "no") << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
void GxsMessageFramePostThread::emitAddPost(const QVariant &post, bool related, int current, int count)
|
||||
{
|
||||
emit addPost(post, related, current, count);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue