void TaskQueue::TaskThreadPool::AddQueueTask(TaskQueue *queue, Task &&task) { QMutexLocker lock(&queues_mutex_); queue->tasks_.push_back(new Task(std_::move(task))); auto list_was_empty = queue_list_.Empty(kAllQueuesList); auto threads_count = threads_.size(); auto all_threads_processing = (threads_count == tasks_in_process_); auto some_threads_are_vacant = !all_threads_processing && list_was_empty; auto will_create_thread = !some_threads_are_vacant && (threads_count < MaxThreadsCount); if (!queue->SerialTaskInProcess()) { if (!queue_list_.IsInList(queue)) { queue_list_.Register(queue); } } if (will_create_thread) { threads_.push_back(MakeThread([this]() { ThreadFunction(); })); threads_.back()->start(); } else if (some_threads_are_vacant) { t_assert(threads_count > tasks_in_process_); thread_condition_.wakeOne(); } }
// Default Run implementation int Thread::Run() { if (!ThreadFunction) return 0; int ret = ThreadFunction(this, UserHandle); return ret; }
// Default Run implementation int Thread::Run() { // Call pointer to function, if available. return (ThreadFunction) ? ThreadFunction(this, UserHandle) : 0; }