#include <deque>
#include <mutex>
#include <future>
#include <thread>
#include <iostream>
#include <string>
#include <condition_variable>


using FuncType = int(*)(int, int);
using TaskType = int();
std::mutex mut;
std::deque<std::packaged_task<TaskType>> tasks;
std::condition_variable cv;

//用户点击了屏幕的坐标事件
int user_click_screen(int x, int y)
{
	std::this_thread::sleep_for(std::chrono::milliseconds(800));  //假设任务与任务之间间隔时间比较长

	std::cout << "User-Screen Event:" << x << "," << y << std::endl;

	return x + y;
}

//用户点击了窗口的坐标事件
int user_click_windows(int x, int y)
{
	std::this_thread::sleep_for(std::chrono::milliseconds(800));  //假设任务与任务之间间隔时间比较长

	std::cout << "User-Windows Event:" << x << "," << y << std::endl;

	return x * y;
}

//把事件包装成更新GUI的任务,放到任务列表里
void post_user_events(FuncType f, int x, int y)
{
	std::packaged_task<int()> t(std::bind(f, x, y));
	std::unique_lock<std::mutex> lg(mut);
	tasks.push_back(std::move(t));
	cv.notify_one();
}

//发布任务线程:假设这个线程一直在监听用户对GUI的操作
void post_tasks_thread()
{
	//发布10组任务
	for (int i = 0; i < 10; ++i)
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(5000));  //假设任务与任务之间间隔时间比较长


		//第一类操作。
		post_user_events(user_click_screen, i + 1, i + 2);
		std::this_thread::sleep_for(std::chrono::milliseconds(500));  //假设任务与任务之间间隔时间比较长

		//第二类操作
		post_user_events(user_click_windows, i + 3, i + 4);
		std::this_thread::sleep_for(std::chrono::milliseconds(500));

		//第三类操作
		//...
	}
}

//更新GUI线程:负责根据接收到的用户事件任务来更新GUI
void update_gui_thread()
{
	std::cout << "xxxxx" << std::endl;

	while (true)
	{
		//获取任务
		std::unique_lock<std::mutex> lg(mut);
		cv.wait(lg, []() {return !tasks.empty(); });
		std::packaged_task<TaskType> t = std::move(tasks.front());
		tasks.pop_front();
		lg.unlock();

		//真正去执行任务,无需参数,因为发布任务的时候,已经将参数打包好了。
		t();

		//获取任务的执行结果
		std::future<int> f = t.get_future();
		int res = f.get();
		std::cout << "任务执行结果:" << res << std::endl;

		if (res > 100)
			break;
	}
}


int main()
{
	std::thread t1(update_gui_thread);
	std::thread t2(post_tasks_thread);
	t1.detach();
	t2.join();
}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐