如何拥有两个独立的任务调度程序?

2024-04-05

我正在编写一个游戏,并且使用 OpenGL,我要求将一些工作卸载到 OpenGL 上下文处于活动状态的渲染线程,但其他所有工作都由普通线程池处理。

有没有一种方法可以强制任务在特殊的线程池中执行,以及从线程池创建的任何新任务async也被调度到那个线程池?

我想要一些专门的线程来渲染,并且我希望能够使用async and await例如用于创建和填充顶点缓冲区。

如果我只使用自定义任务计划程序和new Factory(new MyScheduler())似乎任何后续Task无论如何,对象都会被分派到线程池Task.Factory.Scheduler突然是null.

下面的代码应该显示我想要做什么:

public async Task Initialize()
{
    // The two following tasks should run on the rendering thread pool
    // They cannot run synchronously because that will cause them to fail.
    this.VertexBuffer = await CreateVertexBuffer();
    this.IndexBuffer = await CreateIndexBuffer();

    // This should be dispatched, or run synchrounousyly, on the normal thread pool
    Vertex[] vertices = CreateVertices();
    // Issue task for filling vertex buffer on rendering thread pool
    var fillVertexBufferTask = FillVertexBufffer(vertices, this.VertexBuffer);

    // This should be dispatched, or run synchrounousyly, on the normal thread pool
    short[] indices = CreateIndices();

    // Wait for tasks on the rendering thread pool to complete.
    await FillIndexBuffer(indices, this.IndexBuffer);
    await fillVertexBufferTask; // Wait for the rendering task to complete.
}

有什么办法可以实现这一点,或者它超出了范围async/await?


这是可能的,并且基本上与 Microsoft 对 Windows 窗体和 WPF 同步上下文所做的事情相同。

第一部分 - 您位于 OpenGL 线程中,并且想要将一些工作放入线程池中,并且在该工作完成后您想要返回到 OpenGL 线程中。

我认为你解决这个问题的最佳方法是实施你自己的SynchronizationContext https://msdn.microsoft.com/library/system.threading.synchronizationcontext%28v=vs.110%29.aspx。这个东西基本上控制着如何TaskScheduler工作原理以及它如何安排任务。默认实现只是将任务发送到线程池。你需要做的就是将任务发送到一个专用线程(保存OpenGL上下文)并在那里一一执行它们。

实现的关键是覆盖PostSend方法。两种方法都应该执行回调,其中Send必须等待通话结束Post才不是。使用线程池的示例实现是Send只需直接调用回调即可Post将回调委托给线程池。

对于 OpenGL 线程的执行队列,我认为查询一个线程BlockingCollection https://msdn.microsoft.com/library/dd267312(v=vs.110).aspx应该做得很好。只需将回调发送到该队列即可。如果从错误的线程调用 post 方法并且您需要等待任务完成,您可能还需要一些回调。

但总而言之,这种方式应该可行。async/await确保SynchronizationContext例如,在线程池中执行异步调用后恢复。因此,在将一些工作转移到另一个线程后,您应该能够返回到 OpenGL 线程。

第二部分 - 您位于另一个线程中,想要将一些工作发送到 OpenGL 线程中并等待该工作完成。

这也是有可能的。在这种情况下我的想法是你不使用Task但其他等待的对象。一般来说,每个对象都可以等待的。它只需要实现一个公共方法getAwaiter()返回一个实现的对象INotifyCompletion https://msdn.microsoft.com/library/system.runtime.compilerservices.inotifycompletion(v=VS.110).aspx界面。什么await所做的就是将剩余的方法放入一个新的方法中Action并将此操作发送到OnCompleted https://msdn.microsoft.com/library/system.runtime.compilerservices.inotifycompletion.oncompleted(v=vs.110).aspx该接口的方法。一旦等待的操作完成,等待者就应该调用预定的操作。该服务员还必须确保SynchronizationContext被捕获并在捕获的上执行延续SynchronizationContext。这听起来很复杂,但是一旦掌握了窍门,事情就会变得相当简单。对我帮助很大的是参考资料来源YieldAwaiter http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/YieldAwaitable.cs,dfe9c1a07538b32f(这基本上是如果你使用的话会发生的情况await Task.Yield())。这不是您所需要的,但我认为这是一个起点。

返回等待者的方法必须负责将实际工作发送到必须执行它的线程(您可能已经拥有第一部分中的执行队列),并且等待者必须在该工作完成后触发。

结论

不犯错误。这是一项繁重的工作。但如果你做到了这一切,你就会遇到更少的问题,因为你可以无缝地使用async/await模式就好像您在 Windows 窗体或 WPF 中工作一样,这是一个色调加号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何拥有两个独立的任务调度程序? 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 嵌套异步/等待 Nodejs

    似乎无法弄清楚为什么这对我不起作用 我有一个父函数 它对子加载进程执行 AWAIT LOAD 进程又调用另一个名为 LOADDATA 的 AWAIT 所以基本上是这样的 module exports async function try a
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 记录多线程应用程序中的活动

    我有一个 Java 分层应用程序 它有一个从不同点调用的多线程数据访问层 对该层的一次调用可能会产生多个线程来并行化对数据库的请求 我正在寻找的是一个日志记录工具 它允许我定义由各种线程组成的 活动 因此 数据访问层中的相同方法应根据其调用
  • Rails 3 中全局变量的放置位置

    我曾经将全局变量放入我的 Rails 2 3 8 应用程序的environment rb中 例如 MAX ALLOWD ITEMS 6 它似乎在 Rails 3 中不起作用 我尝试将其放入 application rb 中 但这没有帮助 你
  • Angular 2/4:如何在动态创建的组件上添加表单控件?

    我正在尝试使用 ComponentFactoryResolver 创建反应式表单 我想要以该形式添加的所有组件都是特定的 并实现 ControlValueAccessor 接口 所以 我的问题很简单 如何在使用 ComponentFacto
  • 检查关联数组是否包含值

    Array 0 gt Array questionID gt 47 surveyID gt 51 userID gt 31 question Title gt Choose Any One question Type gt Dropdown
  • 使用 Python 进行视频流传输

    Python 中是否有任何库 或 应用程序可支持视频流 它必须读取文件并需要通过网络进行流式传输 查看波动 http flumotion net 它是一个用Python实现的流媒体服务器
  • Xdebug 未加载

    Windows 7 64 位 PHP 5 3 10 php xdebug 2 1 4 5 3 vc9 x86 64 我通过粘贴 phpinfo 的输出获得了正确的下载here http xdebug org wizard php 这就是我的
  • RabbitMQ 启动失败

    RabbitMQ Windows 服务将无法启动 C Program Files x86 RabbitMQ Server rabbitmq server 3 0 4 sbin gt rabbitmq service bat start C
  • OpenAI API 错误 500:“服务器在处理您的请求时出错”、503:“服务不可用”或 504:“网关超时”

    我创建了一个 Python 脚本 该脚本循环遍历文本字符串列表 每个字符串的长度约为 2000 个字符 并总结每个字符串 请参阅下面的响应代码 此提示位于 for 循环内 response openai Completion create
  • 如何右键单击列表框中的项目并在 WPF 上打开菜单

    我有一个包含文件的列表框 我希望能够右键单击并打开 删除 之类的菜单 以便从列表框中删除文件 目前我在右键单击列表框中的项目后具有此功能 private void listBoxFiles PreviewMouseRightButtonDo
  • 先进先出 (FIFO) 库存成本核算

    这是一篇有趣的文章 我发现它对我的项目很有用 基于集合的 Speed Phreakery 先进先出库存 SQL 问题 http www simple talk com sql performance set based speed phre
  • React Router + Axios 拦截器。如何进行重定向?

    我有一个 axios 拦截器 当用户被强制注销 由于令牌过期 时 我想返回我的主页 我不确定如何将反应路由器传递给它 我正在使用 mobx 但不确定这是否能帮助我解决这个问题 export const axiosInstance axios
  • plupload跨域上传200 http错误

    我想使用 plupload 库将文件上传到远程服务器 使用 html5 运行时的 Chrome 32 0 和 IE 10 一切正常 但当我尝试使用 Firefox 27 html5 运行时 或 IE 8 html4 运行时 时 出现错误Er
  • Mozilla 扩展的内容安全策略

    我在 Mozilla 和 Chrome 中都有一个扩展 在我的扩展中我调用了一个远程 JS 文件 为了避免 Chrome 中的 CSP 我将规则添加到 manifest json 中 并且我的文件通过 HTTPS 传输 因此一切都很完美 但
  • 流星中的页面转换?

    我有一个流星移动应用程序结构上在职的 我确实需要将视图与一些页面转换缝合在一起 我看了看铁过渡剂 https github com tmeasday iron transitioner项目但看起来开发已经停止了 最后一次提交是在 6 个月前
  • 连接 MYSQL 表并按两个字段排序?

    我在 MYSQL 中对表进行排序时遇到问题 我的桌子设置如下 订单详细信息 Order ID 运输费 printed 产品详情 ID Order ID SKU 位置 我想选择打印 FALSE 的所有订单 但还要按运费排序 然后按 SKU l
  • 在 Android 中,即使屏幕进入睡眠模式后仍会继续振动

    在我的应用程序中 我通过以下代码启动 VIBRATOR SERVICE long pattern 50 100 1000 Vibrator vibe Vibrator context getSystemService Context VIB
  • KVC setNilValueForKey:建议调用方法而不使用属性访问器

    The KVC文档 http developer apple com library mac documentation Cocoa Conceptual KeyValueCoding Articles AccessorConvention
  • 使用 requirejs 和 r.js 优化器时无法加载 jQuery 插件

    我的 requirejs 优化器遇到了一些麻烦 运行优化器后 我在构建 编译文件中收到一些错误消息 在没有优化步骤的情况下运行我的网络应用程序时 我没有任何错误 这是我的 client js 文件 包含配置 coffeescript req
  • 选择行并更新相同行以进行锁定?

    我需要编写一个过程 允许我选择 x 行 同时更新这些行 以便调用应用程序知道这些记录已锁定并正在使用 我的表中有一个名为 锁定 的列 下次调用该过程时 它将仅提取下 x 条未选中 锁定 列的记录 我已经阅读了一些有关 SQL Server
  • 如何拥有两个独立的任务调度程序?

    我正在编写一个游戏 并且使用 OpenGL 我要求将一些工作卸载到 OpenGL 上下文处于活动状态的渲染线程 但其他所有工作都由普通线程池处理 有没有一种方法可以强制任务在特殊的线程池中执行 以及从线程池创建的任何新任务async也被调度