qt延时执行类,也可以在子线程中更改UI

#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,保存一个按执行时间排序的链表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值