当前位置: 首页 > 知识库问答 >
问题:

将数据从不同的线程传递到函数

柳鸿博
2023-03-14

我在C 11应用程序中有长时间运行的功能,基本上是sub_main。我需要通知这个函数在不同线程中出现的情况。要求:

  • 情况可以随时上升。
  • 应用程序最多只能在一个地方处理情况(也可以不处理)。
  • 它不需要超快速执行,也不需要延迟执行

截至目前,我考虑了两种选择:

  1. 传递包含情况内部队列的带因子树的对象工厂。然后在<code>sub_main</code>内定期轮询对象,以了解新的<code>情况</code>。轮询对象已从队列中删除。当应用程序决定不处理特定位置的情况时,它可以将其移回全局情况队列,下一个构造的因子树将获得状况(因此它可以在sub_main)中的其他地方处理)。
  2. 类似的情况,但不是轮询,而是使用lambda函数,根据需要更新sub_main中的局部变量。此版本不使用连续轮询,但可读性较差

两者似乎都有点复杂,我想知道我是否错过了一个更简单的解决方案。问题在于sub_main在我的库之外实现,我向最终用户提供了我的情况

共有1个答案

宿楚青
2023-03-14

我最终使用了@PhilBrubaker和责任链的建议:

void sub_main(std::shared_ptr<situation_register> situation_register)
{

    std::unique_ptr<handler_instance> instance =
        situation_register->register(priority::main, [=](situation* s)
        {
            switch(s->get_type())
            {
                 case situation::screensaver:
                      s->get<situation_screensaver>()->prevent();
                      s->mark_as_handled();
                 break;
            }
        });


}

在这种情况下,如果函数没有明确表示情况已处理,它将被传递给下一个注册的处理程序(它们根据优先级排序)。handler_instance是轻量级对象,它将在其析构函数中注销处理程序。

 类似资料:
  • 我在编写一个应用程序时遇到了一些问题。它的工作是用线来解决迷宫。一个线程开始,对于每个分支,它调用另一个类中的静态方法,传递另一个线程需要的参数,然后为每个路径启动线程。我的输出都搞乱了,我不确定这是多线程问题还是引用的问题。下面是一些代码(每个线程都有一个类的新实例): 和返回ValidPaths的方法 CheckEnvirondings使用传递给子级的深度副本(通过构造函数)来验证子级可以采用

  • 问题内容: 我正在尝试使用Django和D3.js编写非常基本的条形图。我有一个名为play的对象,其中datetime字段称为date。我想做的是显示按月分组的播放次数。基本上我有两个问题: 我如何按月份将这些分组,并计算当月的播放次数 将这些信息从Django转换为D3可用的最佳方法是什么。 现在,我在这里查看了其他答案,并尝试了 这接近于我想要的信息,但是当我尝试将其输出到模板中时,它在月末

  • 问题内容: 我知道如何使用jinja模板将数据从python传递到javascript,但是我想将javascript变量传递到python。我想这样做而无需重新加载页面。那可能吗? 问题答案: 是的,就像monkut所说的那样-我相信您想使用JSON和Javascript / jQuery。 这将允许从客户端到服务器的通讯,然后再返回。 我发现的最适用的示例是在Flask片段/模式中:http

  • 问题内容: 我正在编写的应用程序在某个阶段会生成一个ArrayList of Characters。在此阶段,我正在尝试创建一个线程来处理此ArrayList。问题是如何将这个ArrayList传递给线程 描述代码: ProcessList的描述性代码: 我的问题是:如何在run()中传递和访问aList? 问题答案: 您可以简单地传递给的构造函数,该构造函数可以保留引用,直到需要它为止: 注意:

  • 我试图通过C结构从主要Go语言代码到不同的包,并得到类型转换错误。 C头文件test.h 高浪包测试 Go语言主要代码 编译主代码时,我收到以下错误:无法转换 当我尝试对变量进行类型转换时,它给出了以下错误:无法引用未报告的名称测试_Ctype_struct_dd_err_struct无法转换 请帮我解决这个问题

  • 清单2.4中,向std::thread构造函数中的可调用对象,或函数传递一个参数很简单。需要注意的是,默认参数要拷贝到线程独立内存中,即使参数是引用的形式,也可以在新线程中进行访问。再来看一个例子: void f(int i, std::string const& s); std::thread t(f, 3, "hello"); 代码创建了一个调用f(3, "hello")的线程。注意,函数f需