C# COM 跨线程

2024-04-12

我们正在开发一种软​​件来控制科学测量设备。它提供了一个 COM 接口,定义了几个函数来设置测量参数并在测量数据时触发事件。

为了测试我们的软件,我正在实现该设备的模拟。

com 对象运行一个循环,定期触发事件。客户端应用程序中的另一个循环现在应该使用给定的函数设置 com 模拟器。

我创建了一个用于测量参数的类,该类将在设置新测量时实例化。

// COM-Object
public class MeasurementParams
{
    public double Param1;
    public double Param2;
}

public class COM_Sim : ICOMDevice
{
    public MeasurementParams newMeasurement;
    IClient client;

    public int NewMeasurement()
    {
        newMeasurment = new MeasurementParam();
    }

    public int SetParam1(double val)
    {
        // why is newMeasurement null when method is called from client loop
        newMeasurement.Param1 = val;
    }

    void loop()
    {
        while(true)
        {
            // fire event
            client.HandleEvent;
        }
    }
}

public class Client : IClient
{
    ICOMDevice server;

    public int HandleEvent()
    {
        // handle this event
        server.NewMeasurement();
        server.SetParam1(0.0);
    }

    void loop()
    {
        while(true)
        {
            // do some stuff...
            server.NewMeasurement();
            server.SetParam1(0.0);
        }
    }
}

两个循环都在独立的线程中运行。当调用 server.NewMeasurement() 时,服务器上的对象被设置为一个新实例。但在下一个函数中,该对象再次为空。在处理服务器事件时执行相同的操作,它工作得很好,因为该方法在服务器线程中运行。如何让它也从客户端线程工作。

由于客户端是要使用真实设备的,所以我无法修改制造商提供的接口。我还需要设置独立于事件处理程序的测量,该事件处理程序不会定期触发。

我认为这个问题与多线程 COM 行为有关,但我在这个主题上没有发现任何内容。


客户端和服务器的线程模型是什么 - STA 还是 MTA? (仅供参考 - STA 是单线程 Com 对象,意味着一次只能从一个线程访问其公共方法,而 MTA 是多线程对象,允许从多个线程并发访问其公共方法)

每个实例有多少个实例以及如何创建这些实例?我怀疑你只想要一个,但最终却得到了多个。

您有多少个线程以及哪个方法在哪个线程上运行?如何创建这些线程以及它们是否被初始化为运行 STA 对象或 MTA?

Note:.NET 足够智能,可以检测客户端和服务器是否都受到管理,并将 COM 排除在外。因此,您的模拟正在运行纯托管代码。如果您想要正确的测试客户端,您需要将其编写为 C++(因为我怀疑您的设备控制器是非托管代码)。

有关 COM 线程模型的参考文档:

了解和使用 COM 线程模型 http://msdn.microsoft.com/en-us/library/ms809971.aspx
进程、线程和单元 http://msdn.microsoft.com/en-us/library/ms693344(VS.85).aspx
COM 互操作简介 http://msdn.microsoft.com/en-us/library/kew41ycz(VS.71).aspx

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

C# COM 跨线程 的相关文章

  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • Android,Volley请求,响应阻塞主线程

    使用 Volley 处理较大响应时会发生一些不好的事情 String url AppHelper DOMAIN service pages profile update json this infoTextView setText getS
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • 在 org-agenda 上查看中国/韩国/农历生日?

    我周围有一些人使用农历而不是公历 所以我当前的设置 Birthdays PROPERTIES CATEGORY Birthday END NAME lt 1980 09 09 Thu 1y gt 未能在正确的时间出现org agenda 我
  • 获取父类中子类的名称(静态上下文)

    我正在构建一个 ORM 库 考虑到重用性和简单性 一切都很顺利 除了我被一个愚蠢的继承限制所困扰 请考虑下面的代码 class BaseModel Return an instance of a Model from the databas
  • 目标的事件委托

    在下面的代码中 我的click事件代表和所有三个 click 我的视图层次结构中的处理程序被解雇 不过我也想火 edit 在我的整个视图层次结构中 edit 只是我的元素的目标 child view Template
  • Mac 上的 python xgboost 安装

    我正在尝试在 Mac 上安装 xgboost for Python 3 4 但之后出现以下错误pip3 setup py install File
  • 在 openMP C++ 中并行化许多嵌套 for 循环

    你好 我是 C 新手 我编写了一个可以运行的代码 但是由于许多嵌套的 for 循环 它很慢 我想通过 openmp 来加速它 任何可以指导我的人 我尝试使用 pragma omp 并行 前ip循环并在这个循环中我使用了 pragma omp
  • 如何使用 Html.EditorFor 和 MVC3 设置 id

    我试图设置一个字段 id 如下所示 Html EditorFor x gt x Order new id string Format Order 0 Model Row 但这会导致以下结果 并且似乎我的 id 没有被设置
  • 在 Spring 3 控制器中返回字符串时设置重定向的 HTTP 状态代码

    有没有办法在返回时指定HTTP状态码 redirect new url 春季3 没试过 不过看看源码org springframework web servlet view RedirectView it has getHttp11Stat
  • 直线和绘图之间的阴影区域

    我已经彻底搜索了网络 但仍然没有找到确切的解决方案 我需要在 MATLAB 中对直线上方和绘图下方的相交区域进行着色 我需要对阈值 110 以上和绘图下方的区域进行着色 这是一种使用方法area generate data x 1 100
  • mysql从具有不同键的同一列进行多个连接

    我需要一些帮助来与下表进行第二次连接 我之前从这里得到了一些帮助 建议我需要添加第二个 JOIN 但是 这就是我陷入困境并需要一些帮助的地方 wp posts id Post Title 01 Event 1 02 Event 2 wp 后
  • Go:如何接收整个 UDP 数据报

    我的问题 使用 net Read 方法仅复制给定字节数组或切片大小的字节数 当然 我不想每次都分配最大 64 kB 的 UDP 数据报 有没有go如何确定数据报的大小 位于数据报头中 或再次读取直到数据报完全读取 Try 从UDP读取 ht
  • jenkins android找不到sdkmanager.jar

    我在 Mac 操作系统上运行 Jenkins 我有一个尝试执行的 ant 构建文件
  • 使用 Drupal 中的外部身份存储库验证注册数据

    当我的用户尝试注册时 我想通过检查外部身份存储库 例如调用 Web 服务或查找目录服务器 来确保他的信息有效 任何现有模块都可以实现这一点吗 如果没有 开发此功能的最佳方法是什么 我不知道现有模块允许添加自定义验证 但使用 验证 操作来实现
  • 如何在flutter中为android和iOS进行face id身份验证

    您好 我尝试寻找有关在 flutter 中使用面部 ID 进行身份验证的资源 该资源适用于 Android 和 iOS 我尝试搜索一些资源 但大多数人都说face id仅在iOS中可用 有没有任何指南或资源可供我阅读以在 Android 和
  • javascript将元素推入数组的开头[重复]

    这个问题在这里已经有答案了 我有一个对象数组 我想将一个元素推入数组的开头 我有这个 var TheArray TheObjects Array TheArray push TheNewObject 正在添加TheNewObject在最后
  • 在基于mysql中的选择的插入期间增加非自动增量字段

    我使用 select 语句将一个表中的记录插入到另一个表中 插入的表有一个新字段 该字段应在每次更新时递增 1 但不应是自动递增字段 因为每次更新每组记录的数字都需要重新开始 如果使用的 select 语句选择 42 条记录 则新表将具有一
  • AngularJS Protractor - 使用 Ng-Click 绑定查找页面上的元素

    我的页面上有一个按钮 如下所示
  • Bootstrap 3 导航丸不起作用

    我已遵循文档 但我不确定为什么我的pills不工作 HTML
  • gremlin 查询中的类型转换

    如何使用 AWS Neptune GDB 在 gremlin 控制台中将字符串值转换为整数类型 我的属性 age 带有字符串值 需要将其转换为整数类型以进行查询中的数学运算 感谢所有建议 我尝试了以下 kelvin 建议的查询 但遇到了这些
  • 如何使用 Ninject 设置可选方法拦截?

    假设我有一个类 我有时想 但现在总是 拦截一些 但不是全部 方法 据我了解 这可以通过以下方式完成 InterceptAround 在我的 Ninject 模块中 在更高级别的代码中 或者在这些方法上使用 InterceptAttribut
  • C# COM 跨线程

    我们正在开发一种软 件来控制科学测量设备 它提供了一个 COM 接口 定义了几个函数来设置测量参数并在测量数据时触发事件 为了测试我们的软件 我正在实现该设备的模拟 com 对象运行一个循环 定期触发事件 客户端应用程序中的另一个循环现在应