本帖最后由 bestkakkoii 于 2024-2-25 15:05 编辑
炫::异步
基于 C++ 的 std::async配合 首参数 std::launch::async 来将指定函数置于新创建的线程中执行
该类支持多参数传递至多可传9个自定义参数,并且支持获取线程函数的返回值
此类与WINAPI的CreateThread或std::thread别无二致,
优点在于
不需要自己关闭线程句柄,
也不需要特别维持线程变量存活,
亦不需要特地使用全局函数
可以轻松地使用线程
缺点是
无法像 C++20 的 std::jthread 掌控线程的状态
只支持 __cdecl 调用约定
公开函数:
- 炫::任务结果<返回值类型> 炫::异步::执行(&全局函数, 其他参数[最多9个]...)
异步执行一个全局函数
- 炫::任务结果<返回值类型> 炫::异步::执行(&类名::函数名, &类实例变量, 其他参数[最多9个]...)
异步执行一个指定类(已实例)中的公开成员函数
返回值非必须,仅在需要求返回值、或同步等待线程结束的情况才使用
使用方法:
[C++] 纯文本查看 复制代码 函数 整型 我是一个全局函数(int 数字){
返回 数字;
}
类 我是一个类
{
函数 整型 準考證編號(常量 文本型 &名稱, 常量 文本型 &生日, 整型 號碼)
{
炫打印() << 炫::取当前线程編號();
炫::延时(5000);
炫打印() << "名稱:" << 名稱 << "生日:" << 生日 << "號碼:" << 號碼;
返回 號碼;
}
}
炫::异步 線程; //宣告一个全局的 炫::异步实例
函数 整型 入口函数_窗口()
{
炫打印() << 炫::取当前线程編號();
我是一个类 一个类;
// 实际应该直接使用 炫::异步::执行(...) 但目前炫IDE不支持这种写法 所以我们需要事先宣告一个全局实例
// 执行 类成员函数 "準考證編號" 并传入参数 类实例指针 和其他参数 "小明", "1900/01/01", 123456
炫::任务结果<整型> 结果A = 線程.执行(&我是一个类::準考證編號, &一个类, "小明", "1900/01/01", 123456);
结果A.等待至(10000)//最长等待10秒,或线程结束
炫打印() << 结果A.取结果();
炫::任务结果<整型> 结果B = 線程.执行(&我是一个全局函数, 123456);
结果B.等待() //无限等待直到线程结束
炫打印() << 结果B.取结果();
返回 0;
}
使用任务管理器来管理多个线程:
注意,任务结果管理器所管理的线程必须具有相同返回值
[C++] 纯文本查看 复制代码 函数 整型 我是一个全局函数(int 数字)
{
返回 数字;
}
类 我是一个类
{
函数 整型 準考證編號(常量 文本型 &名稱, 常量 文本型 &生日, 整型 號碼)
{
炫::延时(5000);
炫打印() << "名稱:" << 名稱 << "生日:" << 生日 << "號碼:" << 號碼;
返回 號碼;
}
}
炫::异步 線程; //宣告一个全局的 炫::异步实例
函数 整型 入口函数_窗口()
{
//使用任务管理器来管理多个线程
炫::任务结果管理器<整型> 管理器; //用于同时管理多个任务结果
我是一个类 一个类;
// 实际应该直接使用 炫::异步::执行(...) 但目前炫IDE不支持这种写法 所以我们需要事先宣告一个全局实例
// 执行 类成员函数 "準考證編號" 并传入参数 类实例指针 和其他参数 "小明", "1900/01/01", 123456
管理器.添加(線程.执行(&我是一个类::準考證編號, &一个类, "小明", "1900/01/01", 123456));
管理器.添加(線程.执行(&我是一个全局函数, 123456));
管理器.等待完成() //等待所有线程结束
炫::vec<整型> 多个结果 = 管理器.取结果()
炫打印() << 多个结果;
返回 0;
}
|