From 962c7350f3302385614c6197f6809b62ebf94e14 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 26 Mar 2014 11:53:57 -0700 Subject: [PATCH] wait on broadcastThread before destroying AvatarMixer, closes #2499 --- assignment-client/src/avatars/AvatarMixer.cpp | 15 +++++++++------ assignment-client/src/avatars/AvatarMixer.h | 4 +++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index aaf58a7f42..c4c0dcda24 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -32,6 +32,7 @@ const unsigned int AVATAR_DATA_SEND_INTERVAL_MSECS = (1.0f / 60.0f) * 1000; AvatarMixer::AvatarMixer(const QByteArray& packet) : ThreadedAssignment(packet), + _broadcastThread(), _lastFrameTimestamp(QDateTime::currentMSecsSinceEpoch()), _trailingSleepRatio(1.0f), _performanceThrottlingRatio(0.0f), @@ -44,6 +45,11 @@ AvatarMixer::AvatarMixer(const QByteArray& packet) : connect(NodeList::getInstance(), &NodeList::nodeKilled, this, &AvatarMixer::nodeKilled); } +AvatarMixer::~AvatarMixer() { + _broadcastThread.quit(); + _broadcastThread.wait(); +} + void attachAvatarDataToNode(Node* newNode) { if (!newNode->getLinkedData()) { newNode->setLinkedData(new AvatarMixerClientData()); @@ -309,18 +315,15 @@ void AvatarMixer::run() { nodeList->linkedDataCreateCallback = attachAvatarDataToNode; - // create a thead for broadcast of avatar data - QThread* broadcastThread = new QThread(this); - // setup the timer that will be fired on the broadcast thread QTimer* broadcastTimer = new QTimer(); broadcastTimer->setInterval(AVATAR_DATA_SEND_INTERVAL_MSECS); - broadcastTimer->moveToThread(broadcastThread); + broadcastTimer->moveToThread(&_broadcastThread); // connect appropriate signals and slots connect(broadcastTimer, &QTimer::timeout, this, &AvatarMixer::broadcastAvatarData, Qt::DirectConnection); - connect(broadcastThread, SIGNAL(started()), broadcastTimer, SLOT(start())); + connect(&_broadcastThread, SIGNAL(started()), broadcastTimer, SLOT(start())); // start the broadcastThread - broadcastThread->start(); + _broadcastThread.start(); } diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 4171df49af..c9a145d2da 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -15,7 +15,7 @@ class AvatarMixer : public ThreadedAssignment { public: AvatarMixer(const QByteArray& packet); - + ~AvatarMixer(); public slots: /// runs the avatar mixer void run(); @@ -30,6 +30,8 @@ public slots: private: void broadcastAvatarData(); + QThread _broadcastThread; + quint64 _lastFrameTimestamp; float _trailingSleepRatio;