[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src/core Peak.cpp Peak.h
From: |
Remon Sijrier |
Subject: |
[Traverso-commit] traverso/src/core Peak.cpp Peak.h |
Date: |
Fri, 18 May 2007 01:08:48 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Remon Sijrier <r_sijrier> 07/05/18 01:08:47
Modified files:
src/core : Peak.cpp Peak.h
Log message:
* Use only one peak build thread, serialize access too it
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.10&r2=1.11
Patches:
Index: Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- Peak.cpp 17 May 2007 23:27:53 -0000 1.22
+++ Peak.cpp 18 May 2007 01:08:47 -0000 1.23
@@ -27,6 +27,7 @@
#include "Mixer.h"
#include <QFileInfo>
#include <QDateTime>
+#include <QMutexLocker>
#include "Debugger.h"
@@ -177,12 +178,7 @@
void Peak::start_peak_loading()
{
- Q_ASSERT(!peakBuildThread);
-
- if (!peakBuildThread) {
- peakBuildThread = new PeakBuildThread(this);
- peakBuildThread->start();
- }
+ peakbuilder().queue_task(this);
}
@@ -678,9 +674,24 @@
/******** PEAK BUILD THREAD CLASS **********/
/******************************************/
-PeakBuildThread::PeakBuildThread(Peak* peak)
+PeakBuildThread& peakbuilder()
{
- m_peak = peak;
+ static PeakBuildThread peakthread;
+ static long long count;
+ if (!count++) {
+ peakthread.moveToThread(&peakthread);
+ }
+ return peakthread;
+}
+
+
+
+PeakBuildThread::PeakBuildThread()
+{
+ m_runningTasks = 0;
+ start();
+
+ connect(this, SIGNAL(newTask(Peak*)), this, SLOT(start_task(Peak*)),
Qt::QueuedConnection);
#ifndef Q_WS_MAC
// setStackSize(20000);
#endif
@@ -688,7 +699,40 @@
void PeakBuildThread::run()
{
- if(m_peak->create_from_scratch() < 1) {
- PWARN("Failed to create peak buffers");
+ exec();
+}
+
+void PeakBuildThread::start_task(Peak* peak)
+{
+ peak->create_from_scratch();
+
+ m_mutex.lock();
+ m_runningTasks--;
+
+ if (!m_queue.isEmpty()) {
+ m_runningTasks++;
+ Peak* peak = m_queue.dequeue();
+ m_mutex.unlock();
+ emit newTask(peak);
+ return;
}
+ m_mutex.unlock();
}
+
+void PeakBuildThread::queue_task(Peak * peak)
+{
+ m_mutex.lock();
+
+ m_queue.enqueue(peak);
+
+ if (!m_runningTasks) {
+ m_runningTasks++;
+ Peak* peak = m_queue.dequeue();
+ m_mutex.unlock();
+ emit newTask(peak);
+ return;
+ }
+
+ m_mutex.unlock();
+}
+
Index: Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- Peak.h 17 May 2007 23:27:54 -0000 1.10
+++ Peak.h 18 May 2007 01:08:47 -0000 1.11
@@ -24,7 +24,8 @@
#include <QObject>
#include <QThread>
-#include <QHash>
+#include <QMutex>
+#include <QQueue>
#include "defines.h"
@@ -35,12 +36,37 @@
class PeakBuildThread : public QThread
{
+ Q_OBJECT
public:
- PeakBuildThread(Peak* peak);
- Peak* m_peak;
+
+ void queue_task(Peak* peak);
+
+private:
+ QMutex m_mutex;
+
void run();
+
+ int m_runningTasks;
+
+ QQueue<Peak* > m_queue;
+
+ PeakBuildThread();
+ PeakBuildThread(const PeakBuildThread&);
+ // allow this function to create one instance
+ friend PeakBuildThread& peakbuilder();
+
+private slots:
+ void start_task(Peak* peak);
+
+signals:
+ void newTask(Peak* peak);
+
};
+// use this function to access the ProjectManager
+PeakBuildThread& peakbuilder();
+
+
struct PeakData {
int peakDataOffset;
int normValuesDataOffset;
- [Traverso-commit] traverso/src/core Peak.cpp Peak.h,
Remon Sijrier <=