mirror of
https://github.com/Maschell/libutils.git
synced 2024-12-30 22:01:52 +01:00
71 lines
2.3 KiB
C++
71 lines
2.3 KiB
C++
|
/****************************************************************************
|
||
|
* Copyright (C) 2015 Dimok
|
||
|
*
|
||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||
|
****************************************************************************/
|
||
|
#include "AsyncDeleter.h"
|
||
|
|
||
|
AsyncDeleter * AsyncDeleter::deleterInstance = NULL;
|
||
|
|
||
|
AsyncDeleter::AsyncDeleter()
|
||
|
: CThread(CThread::eAttributeAffCore1 | CThread::eAttributePinnedAff)
|
||
|
, exitApplication(false)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
AsyncDeleter::~AsyncDeleter()
|
||
|
{
|
||
|
exitApplication = true;
|
||
|
}
|
||
|
|
||
|
void AsyncDeleter::triggerDeleteProcess(void)
|
||
|
{
|
||
|
if(!deleterInstance)
|
||
|
deleterInstance = new AsyncDeleter;
|
||
|
|
||
|
//! to trigger the event after GUI process is finished execution
|
||
|
//! this function is used to swap elements from one to next array
|
||
|
if(!deleterInstance->deleteElements.empty())
|
||
|
{
|
||
|
deleterInstance->deleteMutex.lock();
|
||
|
while(!deleterInstance->deleteElements.empty())
|
||
|
{
|
||
|
deleterInstance->realDeleteElements.push(deleterInstance->deleteElements.front());
|
||
|
deleterInstance->deleteElements.pop();
|
||
|
}
|
||
|
deleterInstance->deleteMutex.unlock();
|
||
|
deleterInstance->resumeThread();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void AsyncDeleter::executeThread(void)
|
||
|
{
|
||
|
while(!exitApplication || !realDeleteElements.empty())
|
||
|
{
|
||
|
if(realDeleteElements.empty()) suspendThread();
|
||
|
//! delete elements that require post process deleting
|
||
|
//! because otherwise they would block or do invalid access on GUI thread
|
||
|
while(!realDeleteElements.empty())
|
||
|
{
|
||
|
deleteMutex.lock();
|
||
|
AsyncDeleter::Element *element = realDeleteElements.front();
|
||
|
realDeleteElements.pop();
|
||
|
deleteMutex.unlock();
|
||
|
|
||
|
delete element;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|