-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaddDelThread.cpp
More file actions
112 lines (90 loc) · 3.91 KB
/
addDelThread.cpp
File metadata and controls
112 lines (90 loc) · 3.91 KB
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
101
102
103
104
105
106
107
108
109
110
#include "addDelThread.h"
#include "worker.h"
#include "taskManager.h"
void AddDelThread::run() {
std::unique_lock<std::mutex> lock(mutex);
while (!flagCloseApp) {
condition.wait(lock, [this] { return countAddTask > 0 || !vecTaskDelete.empty() || flagCloseApp; });
if (flagCloseApp) break;
// Добавляем задачи
while (countAddTask > 0) {
auto task = createRandomTask<int>(); // Предполагается, что taskManager имеет метод createTask()
if (task) {
emit taskAdded(std::move(task)); // Уведомляем о добавлении новой задачи
--countAddTask;
} else {
// Если создание задачи не удалось, выходим из цикла
break;
}
}
// Удаляем задачи по запросу
for (int taskId : vecTaskDelete) {
// taskManager->removeTaskById(taskId); // Предполагается, что TaskManager имеет метод removeTaskById
emit taskManager->tasksChanged(); // Уведомляем об изменении задач
}
vecTaskDelete.clear();
}
}
template <typename T>
std::unique_ptr<ITask> AddDelThread::createRandomTask()
{
std::random_device rd;
std::mt19937 gen(rd());
int typeChoice = std::uniform_int_distribution<>(0, 5)(gen);
T max_range = std::numeric_limits<T>::max();
T min_range = std::numeric_limits<T>::lowest();
std::uniform_int_distribution<T> startDist(min_range / 2, max_range / 2);
T m_start = startDist(gen);
std::uniform_int_distribution<T> endDist(m_start + 100, max_range);
T m_end = endDist(gen);
std::uniform_int_distribution<T> incrementDist(1, std::max<T>((m_end - m_start) / 600, 1));
T m_increment = incrementDist(gen);
int steps = (m_end - m_start) / m_increment;
while (steps < 100 || steps > 600) {
m_start = startDist(gen);
m_end = endDist(gen);
m_increment = incrementDist(gen);
steps = (m_end - m_start) / m_increment;
}
auto task = std::make_unique<NumericTask<T>>(m_start, m_end, m_increment, this);
int taskId = task->getId();
connect(task.get(), &ITask::taskFinished, [this] {emit taskManager->tasksChanged();} );
connect(task.get(), &ITask::taskFinished, [this, taskId] {taskManager->tasksModel->updateTask(taskId);});
connect(task.get(), &ITask::taskFinished, [this, taskId] {taskManager->deleteTask(taskId);});
connect(task.get(), &ITask::progressUpdated, [this, taskId] {taskManager->tasksModel->updateTask(taskId);});
connect(task.get(), &ITask::statusChanged, [this] {taskManager->tasksModel->sortTasksByStatus();});
return task;
// tasksModel->addTask(std::move(task));
}
// Методы для управления добавлением и удалением задач
void AddDelThread::setAddTasks(short count) {
std::lock_guard<std::mutex> lock(mutex);
countAddTask += count;
condition.notify_one();
}
void AddDelThread::setDeleteTask(int taskId) {
std::lock_guard<std::mutex> lock(mutex);
vecTaskDelete.push_back(taskId);
condition.notify_one();
}
void AddDelThread::setAddWorkers(short count) {
std::lock_guard<std::mutex> lock(mutex);
countAddWorkers += count;
condition.notify_one();
}
void AddDelThread::setDeleteWorker(int workerId) {
std::lock_guard<std::mutex> lock(mutex);
vecWorkerDelete.push_back(workerId);
condition.notify_one();
}
// void AddDelThread::setAddTasks(short count)
// {
// std::lock_guard<std::mutex> lock(mutex);
// countAddTask = count;
// condition.notify_one();
// }
// void AddDelThread::setDeleteTask(int taskId) {
// std::lock_guard<std::mutex> lock(mutex);
// vecTaskDelete.push_back(taskId);
// condition.notify_one();
// }