void DeleteWindow::on_pushButton_2_clicked() { URcontrolcenter urcontrolcenter; urcontrolcenter.getpath(path); urcontrolcenter.start(); } void URcontrolcenter::start() { for (int i = 0; i < 6; ++i) { threads.push_back(std::thread(&URcontrolcenter::processTasks, this)); } for (int i = 0; i < relationship_list.size(); ++i) { taskQueue.push(i); } std::unique_lockstd::mutex lock(mutex); conditionVariable.wait(lock, this { return tasksCompleted == relationship_list.size(); }); } void URcontrolcenter::processTasks() { RewriteRelationShip relationship; int taskNumber; while (true) { { std::unique_lockstd::mutex lock(mutex); if (taskQueue.empty()) { return; } taskNumber = taskQueue.front(); taskQueue.pop(); } relationship.parseData(relationship_list[taskNumber], worningcrosstype); ++tasksCompleted; if (tasksCompleted == relationship_list.size()) { std::unique_lockstd::mutex lock(mutex); conditionVariable.notify_one(); } } } 这段代码执行完任务后程序死机。 修改成:将完成任务数实时发送给deletewindow,全部执行后关闭deletewindow
时间: 2024-02-20 21:57:20 浏览: 61
可以在 `URcontrolcenter` 类中增加一个成员变量 `int tasksCompleted`,在 `processTasks()` 函数中完成任务后,将 `tasksCompleted` 加 1。然后在 `start()` 函数中,每次完成一个任务后,通过信号与槽机制将完成的任务数量发送给 `DeleteWindow` 类。最后,当所有任务都完成时,通过信号与槽机制通知 `DeleteWindow` 类关闭窗口。
具体代码修改如下:
```c++
// URcontrolcenter 类中增加一个成员变量 tasksCompleted
class URcontrolcenter {
// ...
private:
int tasksCompleted = 0;
// ...
};
// 在 URcontrolcenter 类中添加一个信号 finishedTasks(int),
// 用于在完成一个任务后发送任务完成数量给 DeleteWindow 类
class URcontrolcenter : QObject {
Q_OBJECT
// ...
signals:
void finishedTasks(int);
// ...
};
// 修改 start() 函数,完成一个任务后发送信号 finishedTasks(int)
void URcontrolcenter::start() {
for (int i = 0; i < 6; ++i) {
threads.push_back(std::thread(&URcontrolcenter::processTasks, this));
}
for (int i = 0; i < relationship_list.size(); ++i) {
taskQueue.push(i);
}
std::unique_lock<std::mutex> lock(mutex);
while (tasksCompleted < relationship_list.size()) {
conditionVariable.wait(lock);
emit finishedTasks(tasksCompleted);
}
for (auto& thread : threads) {
thread.join();
}
}
// 在 DeleteWindow 类中连接 URcontrolcenter 类的 finishedTasks(int) 信号,
// 并在完成全部任务后关闭窗口
void DeleteWindow::on_pushButton_2_clicked() {
URcontrolcenter urcontrolcenter;
urcontrolcenter.getpath(path);
// 连接信号 finishedTasks(int)
connect(&urcontrolcenter, &URcontrolcenter::finishedTasks, this, [=](int tasksCompleted) {
// 更新任务完成数量
ui->label->setText(QString("Tasks Completed: %1").arg(tasksCompleted));
});
// 开始执行任务
urcontrolcenter.start();
// 关闭窗口
close();
}
```
阅读全文