tilecachequeue.cpp 3.83 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
/**
******************************************************************************
*
* @file       tilecachequeue.cpp
* @author     The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief      
* @see        The GNU Public License (GPL) Version 3
* @defgroup   OPMapWidget
* @{
* 
*****************************************************************************/
/* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation; either version 3 of the License, or 
* (at your option) any later version.
* 
* This program is distributed in the hope that it will be useful, but 
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 
* for more details.
* 
* You should have received a copy of the GNU General Public License along 
* with this program; if not, write to the Free Software Foundation, Inc., 
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "tilecachequeue.h"


//#define DEBUG_TILECACHEQUEUE
 
namespace core {
TileCacheQueue::TileCacheQueue()
{

}
TileCacheQueue::~TileCacheQueue()
{
   // QThread::wait(10000);
}

void TileCacheQueue::EnqueueCacheTask(CacheItemQueue *task)
{
#ifdef DEBUG_TILECACHEQUEUE
    qDebug()<<"DB Do I EnqueueCacheTask"<<task->GetPosition().X()<<","<<task->GetPosition().Y();
#endif //DEBUG_TILECACHEQUEUE
    if(!tileCacheQueue.contains(task))
    {
#ifdef DEBUG_TILECACHEQUEUE
        qDebug()<<"EnqueueCacheTask"<<task->GetPosition().X()<<","<<task->GetPosition().Y();
#endif //DEBUG_TILECACHEQUEUE
        mutex.lock();
        tileCacheQueue.enqueue(task);
        mutex.unlock();
        if(this->isRunning())
        {
#ifdef DEBUG_TILECACHEQUEUE
            qDebug()<<"Wake Thread";
#endif //DEBUG_TILECACHEQUEUE
            //this->start(QThread::NormalPriority);
            //waitmutex.lock();
            waitc.wakeAll();
            //waitmutex.unlock();
        }
        else
        {
#ifdef DEBUG_TILECACHEQUEUE
            qDebug()<<"Start Thread";
#endif //DEBUG_TILECACHEQUEUE
            this->start(QThread::NormalPriority);
        }
    }

}
void TileCacheQueue::run()
{
#ifdef DEBUG_TILECACHEQUEUE
    qDebug()<<"Cache Engine Start";
#endif //DEBUG_TILECACHEQUEUE
    while(true)
    {
        CacheItemQueue *task;
#ifdef DEBUG_TILECACHEQUEUE
        qDebug()<<"Cache";
#endif //DEBUG_TILECACHEQUEUE
        if(tileCacheQueue.count()>0)
        {
            mutex.lock();
            task=tileCacheQueue.dequeue();
            mutex.unlock();
#ifdef DEBUG_TILECACHEQUEUE
            qDebug()<<"Cache engine Put:"<<task->GetPosition().X()<<","<<task->GetPosition().Y();
#endif //DEBUG_TILECACHEQUEUE
            Cache::Instance()->ImageCache.PutImageToCache(task->GetImg(),task->GetMapType(),task->GetPosition(),task->GetZoom());
            usleep(44);
            delete task;
        }

        else
        {
101
            #ifdef DEBUG_TILECACHEQUEUE
102
            qDebug()<<"Cache engine BEGIN WAIT";
103
            #endif //DEBUG_TILECACHEQUEUE
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
            waitmutex.lock();
            int tout=4000;
            if(!waitc.wait(&waitmutex,tout))
            {
                waitmutex.unlock();
#ifdef DEBUG_TILECACHEQUEUE
                qDebug()<<"Cache Engine TimeOut";
#endif //DEBUG_TILECACHEQUEUE
                mutex.lock();
                if(tileCacheQueue.count()==0)
                {
                    mutex.unlock();
                    break;
                }
                mutex.unlock();
            }
120
            #ifdef DEBUG_TILECACHEQUEUE
121
            qDebug()<<"Cache Engine DID NOT TimeOut";
122
            #endif //DEBUG_TILECACHEQUEUE
123 124 125 126 127 128 129 130 131 132
            waitmutex.unlock();
        }
    }
#ifdef DEBUG_TILECACHEQUEUE
    qDebug()<<"Cache Engine Stopped";
#endif //DEBUG_TILECACHEQUEUE
}


}