本文整理汇总了C++中WorkItem类的典型用法代码示例。如果您正苦于以下问题:C++ WorkItem类的具体用法?C++ WorkItem怎么用?C++ WorkItem使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了WorkItem类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ProcessItems
void WorkQueue::ProcessItems(unsigned threadIndex)
{
bool wasActive = false;
for (;;)
{
if (shutDown_)
return;
if (pausing_ && !wasActive)
Time::Sleep(0);
else
{
queueMutex_.Acquire();
if (!queue_.Empty())
{
wasActive = true;
WorkItem* item = queue_.Front();
queue_.PopFront();
queueMutex_.Release();
item->workFunction_(item, threadIndex);
item->completed_ = true;
}
else
{
wasActive = false;
queueMutex_.Release();
Time::Sleep(0);
}
}
}
}
示例2: wxLogMessage
void* WorkerThread::Entry()
{
WorkItem* item;
wxLogMessage( _T( "WorkerThread started" ) );
while ( !TestDestroy() ) {
// sleep an hour or until a new WorkItem arrives (DoWork() will wake us up).
Sleep( 3600 * 1000 );
while ( !TestDestroy() && ( item = m_workItems.Pop() ) != NULL ) {
try {
wxLogMessage( _T( "running WorkItem %p, prio = %d" ), item, item->m_priority );
item->Run();
}
catch ( ... ) {
// better eat all exceptions thrown by WorkItem::Run(),
// don't want to let the thread die on a single faulty WorkItem.
wxLogMessage( _T( "WorkerThread caught exception thrown by WorkItem::Run" ) );
}
CleanupWorkItem( item );
// give other threads some air
Yield();
}
}
// cleanup leftover WorkItems
while ( ( item = m_workItems.Pop() ) != NULL ) {
CleanupWorkItem( item );
}
wxLogMessage( _T( "WorkerThread stopped" ) );
return 0;
}
示例3: while
void WorkItemQueue::Process()
{
while (!m_dying) {
WorkItem* item = NULL;
boost::unique_lock<boost::mutex> lock(m_mutex);
while ((!m_dying) && (item = Pop())) {
try {
// LslDebug( "running WorkItem %p, prio = %d", item, item->m_priority );
item->Run();
} catch (std::exception& e) {
// better eat all exceptions thrown by WorkItem::Run(),
// don't want to let the thread die on a single faulty WorkItem.
LslDebug("WorkerThread caught exception thrown by WorkItem::Run -- %s", e.what());
} catch (...) {
LslDebug("WorkerThread caught exception thrown by WorkItem::Run");
}
CleanupWorkItem(item);
}
// cleanup leftover WorkItems
while ((item = Pop()) != NULL) {
CleanupWorkItem(item);
}
if (!m_dying)
//wait for the next Push
m_cond.wait(lock);
}
}
示例4: lk
void ReplicationExecutor::doOperationWithGlobalExclusiveLock(
OperationContext* txn,
const CallbackHandle& cbHandle) {
boost::unique_lock<boost::mutex> lk(_mutex);
if (_inShutdown)
return;
const WorkQueue::iterator iter = cbHandle._iter;
const uint64_t generation = iter->generation;
invariant(generation == cbHandle._generation);
WorkItem work = *iter;
iter->callback = CallbackFn();
_freeQueue.splice(_freeQueue.begin(), _exclusiveLockInProgressQueue, iter);
lk.unlock();
{
boost::lock_guard<boost::mutex> terribleLock(_terribleExLockSyncMutex);
work.callback(CallbackData(this,
cbHandle,
(work.isCanceled ?
Status(ErrorCodes::CallbackCanceled, "Callback canceled") :
Status::OK()),
txn));
}
lk.lock();
signalEvent_inlock(work.finishedEvent);
}
示例5: while
void WorkQueue_Impl::worker_main()
{
while (true)
{
int wakeup_reason = Event::wait(stop_event, work_available_event);
if (wakeup_reason != 1)
break;
MutexSection mutex_lock(&mutex);
if (!queued_items.empty())
{
WorkItem *item = queued_items.front();
queued_items.erase(queued_items.begin());
mutex_lock.unlock();
item->process_work();
mutex_lock.lock();
finished_items.push_back(item);
mutex_lock.unlock();
set_wakeup_event();
}
else
{
work_available_event.reset();
}
}
}
示例6: avgRenderTime
QTime Job::avgRenderTime(int& days)
{
QTime sum,diff,midnight;
QDateTime left,right;
int tempDays,counter = 0,hour;
//24*60*60*1000 = 86400000
const long MS_PER_DAY = 86400000;
long daySeconds, timeSeconds;
WorkItem* currentItem = finished.first();
days = 0;
//traverse finished list
while(currentItem)
{
left = currentItem->getFinish();
right = currentItem->getStart();
diff = left.time() - right.time();
//if the hours combine to more than 24 add a day
hour = diff.hour() + sum.hour();
if(hour >= 24)
days++;
//add to sum
sum = diff + sum;
//find the days between start time and finish time
tempDays = right.daysTo(left);
//if the difference is greater than one day add the difference
if(tempDays > 0)
{
days = days + tempDays - 1;
if(diff >= midnight)
days++;
}
currentItem = finished.next();
counter++;
}
//now calculate the average.
//days must be converted into ms
//sum must be converted into ms
//the two must be added and devided by counter
daySeconds = ((double)days/counter)*24*60*60*1000;
timeSeconds = sum.hour()*60*60*1000 + sum.minute()*60*1000 + sum.second()*1000 + sum.msec();
if(counter > 0)
timeSeconds = timeSeconds/counter + daySeconds;
else
timeSeconds = 0;
midnight = midnight.addMSecs(timeSeconds%MS_PER_DAY);
days = timeSeconds/MS_PER_DAY;
return midnight;
}
示例7: removeItem
SOM_Scope short SOMLINK removeItem(Day *somSelf, Environment *ev,
string start, string end, string desc)
{
DayData *somThis = DayGetData(somSelf);
short i;
WorkItem *item;
DayMethodDebug("Day","removeItem");
for (i=0; i < sequenceLength(somThis->workList); i++ )
{
item = sequenceElement(somThis->workList,i);
if ( (strcmp(start, item->_get_startTime(ev)) == 0) &&
(strcmp(end, item->_get_endTime(ev)) == 0) &&
(strcmp(desc, item->_get_task(ev)) == 0) )
{
sequenceLength(somThis->workList)--;
for (i; i < sequenceLength(somThis->workList); i++)
{
sequenceElement(somThis->workList,i) =
sequenceElement(somThis->workList, i+1);
}
somSelf->sompSetDirty(ev);
return 0;
}
}
return -1L; // item not found
}
示例8: jobFailed
void ServerObject::jobFailed(const QString& str, QThread* thread)
{
Thread* thr = (Thread*)thread;
WorkItem *nextItem;
if (unpaused)
{
//jobs->renderFailed(((Thread*)thread)->getInfo());
uint jobid;
nextItem = jobs->getItem(&jobid);
// here is where we queue in the next job in the list
if (nextItem) {
emit finished(thr->getHost().append(" ").append(str));
thr->setJobId(jobid);
thr->setJobName(nextItem->getJob()->getJobName());
thr->setInfo(nextItem);
thr->start();
}
else{
emit finished(thr->getHost().append(" ").append(str));
emit finished(tr("All jobs finished on ").append(thr->getHost()));
}
}
else {
emit finished(thr->getHost().append(" ").append("paused"));
}
}
示例9: ptr
inline F32 ThreadPool::WorkItemWrapper::getPriority()
{
WorkItem* item = ptr();
AssertFatal( item != 0, "ThreadPool::WorkItemWrapper::getPriority - called on dead item" );
// Compute a scaled priority value based on the item's context.
return ( item->getContext()->getAccumulatedPriorityBias() * item->getPriority() );
}
示例10: Callback
static void Callback(PTP_CALLBACK_INSTANCE, PVOID state, PTP_WORK)
{
WorkItem* workItem = static_cast<WorkItem*>(state);
workItem->callback_();
::CloseThreadpoolWork(workItem->work_);
workItem->selfReferenceSPtr_.reset();
}
示例11: while
WorkList::~WorkList() {
// Delete any WorkItems in the queue:
WorkItem* item;
cci_debug_printf("%s", __FUNCTION__);
char buf[2048];
char* pbuf = (char*)buf;
while (remove(&item)) {
cci_debug_printf("WorkList::~WorkList() deleting %s", item->print(pbuf));
delete item;
}
DeleteCriticalSection(&cs);
}
示例12: Resume
void WorkQueue::Complete(unsigned priority)
{
completing_ = true;
if (threads_.Size())
{
Resume();
// Take work items also in the main thread until queue empty or no high-priority items anymore
while (!queue_.Empty())
{
queueMutex_.Acquire();
if (!queue_.Empty() && queue_.Front()->priority_ >= priority)
{
WorkItem* item = queue_.Front();
queue_.PopFront();
queueMutex_.Release();
item->workFunction_(item, 0);
item->completed_ = true;
}
else
{
queueMutex_.Release();
break;
}
}
// Wait for threaded work to complete
while (!IsCompleted(priority))
{
}
// If no work at all remaining, pause worker threads by leaving the mutex locked
if (queue_.Empty())
Pause();
}
else
{
// No worker threads: ensure all high-priority items are completed in the main thread
while (!queue_.Empty() && queue_.Front()->priority_ >= priority)
{
WorkItem* item = queue_.Front();
queue_.PopFront();
item->workFunction_(item, 0);
item->completed_ = true;
}
}
PurgeCompleted(priority);
completing_ = false;
}
示例13: worklist_remove
EXTERN_C int worklist_remove(long* rpcmsg,
ccs_pipe_t* pipe,
k5_ipc_stream* stream,
time_t* sst) {
WorkItem* item = NULL;
cc_int32 err = worklist.remove(&item);
*rpcmsg = item->type();
*pipe = item->take_pipe();
*stream = item->take_payload();
*sst = item->sst();
delete item;
return err;
}
示例14: run
void* run() {
// Remove 1 item at a time and process it. Blocks if no items are
// available to process.
for (int i = 0;; i++) {
printf("thread %lu, loop %d - waiting for item...\n",
(long unsigned int)self(), i);
WorkItem* item = m_queue.remove();
printf("thread %lu, loop %d - got one item\n",
(long unsigned int)self(), i);
printf("thread %lu, loop %d - item: message - %s, number - %d\n",
(long unsigned int)self(), i, item->getMessage(),
item->getNumber());
delete item;
}
return NULL;
}
示例15: disown
Job::~Job()
{
WorkItem* tempItem;
working.first();
while(!working.isEmpty())
{
tempItem = working.take();
//set workitems job pointer to null
tempItem->setParentJob(0);
//put work items in a special list of WorkQueue class to be deleted
//when they are finished.
emit disown(tempItem);
}
}