controlpanelui/src/cpcategorymodel/src/cptaskexecutor.cpp
author hgs
Fri, 14 May 2010 13:21:08 +0800
changeset 19 36aa4756ee82
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0""
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include "cptaskexecutor.h"
hgs
parents:
diff changeset
    18
#include <QMutexLocker>
hgs
parents:
diff changeset
    19
#include <QDebug>
hgs
parents:
diff changeset
    20
#include <QtAlgorithms>
hgs
parents:
diff changeset
    21
#include <QPointer>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
static QPointer<CpTaskExecutor> g_instance;
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
CpTaskExecutor *CpTaskExecutor::globalInstance()
hgs
parents:
diff changeset
    26
{
hgs
parents:
diff changeset
    27
    if (!g_instance) {
hgs
parents:
diff changeset
    28
        g_instance = new CpTaskExecutor();
hgs
parents:
diff changeset
    29
    }
hgs
parents:
diff changeset
    30
    return g_instance.data();
hgs
parents:
diff changeset
    31
}
hgs
parents:
diff changeset
    32
    
hgs
parents:
diff changeset
    33
void CpTaskExecutor::destroyGlobalInstance()
hgs
parents:
diff changeset
    34
{
hgs
parents:
diff changeset
    35
    delete g_instance.data();
hgs
parents:
diff changeset
    36
}
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
CpTaskExecutor::CpTaskExecutor(QObject *parent /*=0*/) 
hgs
parents:
diff changeset
    39
: QThread(parent), mStopped(false)
hgs
parents:
diff changeset
    40
{
hgs
parents:
diff changeset
    41
}
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
CpTaskExecutor::~CpTaskExecutor()
hgs
parents:
diff changeset
    44
{
hgs
parents:
diff changeset
    45
    stop();
hgs
parents:
diff changeset
    46
}
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
bool CpTaskExecutor::runTask(CpTask *task,bool append /*= false*/)
hgs
parents:
diff changeset
    49
{
hgs
parents:
diff changeset
    50
    if (mStopped) {
hgs
parents:
diff changeset
    51
        if (isRunning()) {
hgs
parents:
diff changeset
    52
            qDebug() << "thread in stopping process...can not run task.\r\n";
hgs
parents:
diff changeset
    53
            return false;
hgs
parents:
diff changeset
    54
        }
hgs
parents:
diff changeset
    55
        mStopped = false;
hgs
parents:
diff changeset
    56
    }
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    if (task) {
hgs
parents:
diff changeset
    59
        {
hgs
parents:
diff changeset
    60
            QMutexLocker locker(&mMutex);
hgs
parents:
diff changeset
    61
            if (append) {
hgs
parents:
diff changeset
    62
                mTasks.append(task);
hgs
parents:
diff changeset
    63
            }
hgs
parents:
diff changeset
    64
            else {
hgs
parents:
diff changeset
    65
                mTasks.insert(0,task);
hgs
parents:
diff changeset
    66
            }
hgs
parents:
diff changeset
    67
        }
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
        if (!isRunning()) {
hgs
parents:
diff changeset
    70
            qDebug() << "isRunning() == false, call start()\r\n";
hgs
parents:
diff changeset
    71
            start();
hgs
parents:
diff changeset
    72
        }
hgs
parents:
diff changeset
    73
    }
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    return true;
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
void CpTaskExecutor::stop()
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    if (!mStopped && isRunning() ) {
hgs
parents:
diff changeset
    81
       mStopped = true;
hgs
parents:
diff changeset
    82
       removeTasks();
hgs
parents:
diff changeset
    83
       wait(); //wait for finished
hgs
parents:
diff changeset
    84
    }
hgs
parents:
diff changeset
    85
}
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
void CpTaskExecutor::removeTasks()
hgs
parents:
diff changeset
    88
{
hgs
parents:
diff changeset
    89
    QMutexLocker locker(&mMutex);
hgs
parents:
diff changeset
    90
    
hgs
parents:
diff changeset
    91
    QList<CpTask*>::const_iterator begin(mTasks.begin());
hgs
parents:
diff changeset
    92
    QList<CpTask*>::const_iterator end(mTasks.end());
hgs
parents:
diff changeset
    93
    for (; begin != end; ++begin) {
hgs
parents:
diff changeset
    94
        if ((*begin)->autoDelete()) {
hgs
parents:
diff changeset
    95
            delete (*begin);
hgs
parents:
diff changeset
    96
        }
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
    mTasks.clear();
hgs
parents:
diff changeset
   100
}
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
void CpTaskExecutor::run()
hgs
parents:
diff changeset
   103
{
hgs
parents:
diff changeset
   104
    while (!mStopped) {
hgs
parents:
diff changeset
   105
        CpTask *task = 0;
hgs
parents:
diff changeset
   106
        {
hgs
parents:
diff changeset
   107
            QMutexLocker locker(&mMutex);
hgs
parents:
diff changeset
   108
            if (mTasks.isEmpty()) {
hgs
parents:
diff changeset
   109
                break;
hgs
parents:
diff changeset
   110
            }
hgs
parents:
diff changeset
   111
            task = mTasks.takeFirst();
hgs
parents:
diff changeset
   112
        }
hgs
parents:
diff changeset
   113
        try {
hgs
parents:
diff changeset
   114
            task->execute(&mStopped);
hgs
parents:
diff changeset
   115
            task->complete(&mStopped);
hgs
parents:
diff changeset
   116
        }catch(...) {
hgs
parents:
diff changeset
   117
            qDebug() << "excetion occur when running task\r\n";           
hgs
parents:
diff changeset
   118
        }
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
        if (task->autoDelete()) {
hgs
parents:
diff changeset
   121
            delete task;
hgs
parents:
diff changeset
   122
        }
hgs
parents:
diff changeset
   123
    }
hgs
parents:
diff changeset
   124
}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
bool CpTaskExecutor::toFront(CpTask *task)
hgs
parents:
diff changeset
   127
{
hgs
parents:
diff changeset
   128
    QMutexLocker locker(&mMutex);
hgs
parents:
diff changeset
   129
    QList<CpTask*>::iterator foundIterator = ::qFind(mTasks.begin(),mTasks.end(),task);
hgs
parents:
diff changeset
   130
    if (foundIterator == mTasks.end()) {
hgs
parents:
diff changeset
   131
        return false;
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
    
hgs
parents:
diff changeset
   134
    mTasks.erase(foundIterator);
hgs
parents:
diff changeset
   135
    mTasks.insert(0,task);
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
    return true;
hgs
parents:
diff changeset
   138
}
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
//End of File