#include <functional>
#include <mutex>
#include <list>
class DelayTask
{
struct Task
{
int64_t time;
std::function<void()> func;
};
public:
static DelayTask* ins();
void addTask(int millseconds, std::function<void()>&& func);
protected:
DelayTask() ;
std::list<Task> tasks;//不用map因为两个任务可能时间相同而冲突
std::mutex mtx;
void run();
};
#include <QTimer>
DelayTask* DelayTask::ins()
{
static DelayTask instance;
return &instance;
}
DelayTask::DelayTask()
{
auto t = new QTimer();
QObject::connect(t, &QTimer::timeout, [this]() {run(); });
t->start(100);
}
void DelayTask::addTask(int millseconds, std::function<void()>&& func)
{
std::lock_guard<std::mutex> LockGuard(mtx);
int64_t time = clock() + millseconds;
for (auto i = tasks.begin(); i != tasks.end(); i++)
{
if (i->time > time)
{
tasks.insert(i, Task{ time,std::move(func) });
return;
}
}
tasks.emplace_back(Task{ time, std::move(func) });
}
void DelayTask::run()
{
std::lock_guard<std::mutex> LockGuard(mtx);
int64_t time = clock();
for (auto i = tasks.begin(); i != tasks.end(); i++)
{
if (i->time <= time)
{
i->func();
i = tasks.erase(i);
if (i == tasks.end())
return;
}
else
return;
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
auto l1 = new QLabel("0");
l1->show();
DelayTask::ins()->addTask(2000, [=]() {
l1->setText("2000");
});
QtConcurrent::run([=]() {
_sleep(4000);//子线程处理中
//l1->setText("4000");//会崩溃
DelayTask::ins()->addTask(0, [=]() {
l1->setText("4000");
});
});
return a.exec();
}
用定时器更改ui,保存一个按执行时间排序的链表。