如何在WinRT下并行线程中执行C++函数?

2024-03-27

我有一个 C++ 代码,它使用 _beginthreadex() Windows 方法在线程中执行函数。现在我想将其移植到 WinRT 组件以将其包含在 Windows Phone 应用程序中。但Windows Phone不支持_beginthreadex()。我该怎么做?

我的功能是:

bool doesWordAppearInDictionarry(char* word);

我的计算机上有 4 个核心,因此我想并行执行该函数的 4 个副本(同时在字典中搜索 4 个不同的单词)。

I read (here http://msdn.microsoft.com/en-us/library/windows/apps/windows.system.threading.threadpool.runasync.Aspx) and (here http://www.getcodesamples.com/src/EBA6140) about Windows::System::Threading::WorkItemHandler, ThreadPool's and IAsyncAction但提供的示例激活托管代码并且不调用本机函数。

我正在寻找一个干净的解决方案(最少的代码行),它将取代我当前的 Windows 桌面代码:

for (int i=0; i<4; i++){
    tInfo[i].id = (HANDLE)_beginthreadex( NULL, stack_size, doesWordAppearInDictionarry,tInfo, 0, word[i]);
}
for (int i=0; i<4; i++){
    WaitForSingleObject( tInfo[i].id, INFINITE );
    CloseHandle(tInfo[i].id);
}

这是一个简短的解决方案:使用 WinRT api 模拟 _beginthreadex() 的几行代码。

using namespace Platform;
using namespace Windows::System::Threading;

_Use_decl_annotations_ HANDLE WINAPI _beginthreadex(LPSECURITY_ATTRIBUTES unusedThreadAttributes, SIZE_T unusedStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD unusedThreadId){        
    // Create a handle for the new thread.
    HANDLE threadHandle = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); 
    if (!threadHandle)
        return nullptr;

    try{
        auto workItemHandler = ref new WorkItemHandler([=](IAsyncAction^){
            lpStartAddress(lpParameter);
            SetEvent(threadHandle);         // Signal that the thread has completed (assuming this handle was not destroyed by the caller due to time-out).
        }, CallbackContext::Any);
        ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::TimeSliced);
        return threadHandle;                // Return the handle to the caller (he can wait for this handle until thread terminates).
    }
    catch (...){
        CloseHandle(threadHandle);  // Clean up if thread creation fails.
        return nullptr;
    }
}

该解决方案基于堆栈溢出答案(here https://stackoverflow.com/questions/15839895/porting-createthread-calls-to-win8-winrt-app)其中讨论了(this http://blogs.msdn.com/b/shawnhar/archive/2012/03/12/createthread-for-windows-8-metro.aspx?PageIndex=2) 博客。该博客包含对线程的完整模拟,包括 CreateThread() Win32 API,在线程运行时访问线程并在线程之间共享内存。我的解决方案是完整模拟器的简化案例。

附注调用者方法必须等待线程使用WaitForSingleObjectEx() 方法而不是WaitForSingleObject()

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

如何在WinRT下并行线程中执行C++函数? 的相关文章

  • 什么是具有副作用的表达式?为什么不应将它们传递给宏?

    我在 C 如何编程 一书中看到这样一句话 具有副作用 即变量值被修改 的表达式不应传递给宏 因为宏参数可能会被多次求值 我的问题是什么是具有副作用的表达式以及为什么不应将它们传递给宏 经典的例子是计算两个值的最大值的宏 define MAX
  • C++ - 错误 C3646:未知的覆盖说明符

    我修改了我的项目 编译后弹出一些奇怪的错误 ifndef BART RAY TRACER MESH H define BART RAY TRACER MESH H include
  • 返回带有列表对象的列表对象

    我有三个表 汽车品牌 汽车型号 和 CarsandModel 我有 Carsand 模型表 因为一个模型可以由多个制造商构建 我想返回包含汽车型号列表的汽车品牌列表 我现在的长篇大论不是过滤汽车型号的汽车制造商列表 我尝试添加一个 wher
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如果将其名称作为参数传递,如何在方法中打开表单

    我正在尝试创建一个标准方法来根据传递给它的参数打开表单 基本上 要完成此任务 using Quotes newQte new Quotes newQte ShowDialog 通过替换 Quotes with a passed parame
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • c++ 最大 std::string 长度由堆栈大小或堆大小决定?

    正如问题中所问 std string myVar 它可以容纳的最大字符是由堆栈还是堆决定的 谢谢 默认情况下 分配的内存为std string是动态分配的 注意std string has a max size 函数返回实现支持的最大字符数
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 如何将日期格式从 DD/MM/YYYY 或 MM/DD/YYYY 更改为 YYYY-MM-DD?

    我需要使用 C 更改日期字符串的格式 来自 06 16 2010 或 16 06 2010 至 2010 06 16 你能帮我实现这个目标吗 thanks 如果您已经将其作为DateTime use string x dt ToString
  • C# 从字符串变量中获取类型并在泛型方法中使用它

    我希望能够通过某种方式 即从数据库 获取我收到的字符串值的实际类型 这样我就可以在通用方法中使用该类型 例如DoSomething
  • 从子线程绘制到窗口

    我的应用程序从工作线程绘制图形已有 10 多年了 而且我从未遇到过任何问题 工作线程吸引到我的HWND 由主线程创建 如下所示 hdc GetDC hwnd SetDIBitsToDevice or StretchDIBits Releas
  • 获取当前登录的 Windows Live Id (Windows Phone 7)

    我知道 Windows Phone 7 要求您在启动时输入 Windows Live ID 有没有办法从手机上安装的 Silverlight 应用程序访问有关该帐户的信息 Thanks 在此阶段 Windows Live ID 将无法自动供
  • Visual Studio 扩展找不到所需的程序集

    我为 Visual Studio 2013 编写了一个扩展 因为该死的组合框错误 https stackoverflow com questions 7800032 cancel combobox selection in wpf with
  • timeval_subtract 解释

    使用 timeval subtract 函数来查找两个 struct timeval 类型之间经过的时间 有人可以解释一下用于 通过更新 y 执行后续减法的进位 和其他部分的目的和逐步数学吗 我了解该函数的目的以及如何在程序中实现它 但我想
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 如何将curlpp 添加到我的项目中?

    我正在尝试从 vb net 过渡到 C 但我陷入了困境 我从下载了curpp这给了我一个 dll exp 和 lib 文件 我将包含这 3 个文件的目录添加到项目属性中的 附加库目录 链接器 gt 常规 接下来 我将 ws2 32 lib
  • printf 右对齐括号内的数字

    我正在编写一个程序 显示数组中的所有信息 它必须以括号中的数组索引开头 例如 2 并且它们必须彼此正确对齐 如果只是数字 我知道你可以这样做 printf 10d index 但是用括号括起来会得到以下输出 1 2 10 11 当我真正希望
  • C++ 中带逗号的表达式的执行顺序 [重复]

    这个问题在这里已经有答案了 我的理解是这个词j i将在之前执行 i在声明中 j i i C 标准是否保证j i将在之前执行 i在循环 for auto i std next begin j begin i end j i i 逗号运算符引入

随机推荐

  • 用于调试的 YII 日志记录

    在很多情况下 Xdebug不适合调试 因为它涉及点击运行到特定的代码行 我想使用类似的东西cakePHP调试功能 供开发人员将类的特定属性的值输出到浏览器 我在用Yii framework这是我的配置yii log in the main
  • 如何实例化对象的静态向量?

    我有一个 A 类 它有一个静态对象向量 对象属于 B 类 class A public static void InstantiateVector private static vector b vector of B 在函数 Instan
  • 修改现有的 Android ROM 以控制用户操作

    我正在为客户创建一个 Android 应用程序 该应用程序将预安装并与手机一起分发 现在客户要求我锁定 ROM 以防止未来的用户使用除此应用程序之外的任何其他应用程序 IE 没有浏览 没有电子邮件 没有任何可能产生任何费用的东西等 现在 经
  • 在 CMD 批处理脚本中调用标签时如何利用超过 9 个参数?

    我想知道如何在调用标签时在批处理脚本中调用超过 9 个参数 例如 下面显示我分配了 12 个参数 并尝试回显所有这些参数 CALL LABEL one two three four five six seven eight nine ten
  • Kafka消费者默认组ID

    我正在使用 Apache Kafka 及其 Java 客户端 我发现消息在属于同一组的不同 Kafka Consumer 之间进行负载平衡 即共享相同的组 id 在我的应用程序中 我需要所有消费者阅读所有消息 所以我有几个问题 如果我没有在
  • 在 IntelliJ IDEA 中编写并运行 pyspark

    我正在尝试在 IntelliJ 中使用 Pyspark 但我不知道如何正确安装它 设置项目 我可以在 IntelliJ 中使用 Python 并且可以使用 pyspark shell 但我无法告诉 IntelliJ 如何查找 Spark 文
  • 如何在Python中导入其他项目的函数?

    我在一个项目中有一些代码 我想在另一个项目中重用它们 我需要做什么 在两个文件夹中 才能执行此操作 目录结构类似于 Foo Project1 file1 py file2 py Bar Project2 fileX py fileY py
  • 在单个查询中获取分页行和总计数

    核心要求 查找 a 的最新条目person id by submission date对于指定的过滤条件type plan status 可能有更多这样的过滤器 但无论如何 按提交日期返回最新的逻辑是相同的 有两个主要用途 一是在 UI 中
  • Android setContentView 还是 Intents?

    我有一个非常简单的 2 屏幕 Android 应用程序 简单地通过 setContentView 切换布局有什么缺点吗 或者我应该使用意图吗 如果出现问题 我不想打扰我的应用程序 另一件需要考虑的事情是 活动形成了stack http de
  • 从重叠的日期范围中获取不同的连续日期范围

    我需要从重叠日期列表中获取彼此不重叠的日期范围列表 并获取重叠期间的硬币总和 我尝试过用谷歌搜索一个例子 但到目前为止还没有运气 我可能没有使用正确的关键词 我有一个重叠日期的列表 1 1 2018 31 1 2018 80 7 1 201
  • 有没有一种方法可以使用 JavaScript 在网页中漂亮地打印 JSON?

    在我看来 漂亮打印 JSON 是一个足够简单的任务 JavaScript 应该能够处理它 有没有人编写过 或运行过 JavaScript 函数来执行此操作 执行此操作的一个简单方法是执行 JSON stringify data null w
  • 导入 go 包时出现问题

    这是我的代码结构 addition summing sum prg go addition go go mod go mod 的内容 module addition go 1 14 sum prg go 的内容 package summin
  • 如何在 Haskell 中查找运行时的核心数量

    Haskell 是否有一种方法可以确定运行时机器上存在的 CPU 核心数量 是的 有这样的方法 来自 现实世界 Haskell 的代码 http book realworldhaskell org read concurrent and m
  • 如何在eclipse中导入Jdeveloper java项目?

    我在 Jdeveloper 中有一个 java 项目 但我想将该项目迁移到 eclipse java 项目 你知道该怎么做吗 或者我必须手动导入它吗 提前致谢 通常 如果项目是基于 Web 的项目或 java 项目 则它有其结构 您应该能够
  • 无法在 VS2015 Enterprise 中使用 Microsoft Fakes - 缺少 COR_PROFILER

    我正在尝试在 VS 2015 Enterprise 中使用 Microsoft Fakes 我什至无法运行任何测试 我没有 testsettings 或 runsettings 文件 简单的测试项目参考 Microsoft QualityT
  • 与 Objective C 相比,Swift SHA256 加密返回不同的加密字符串

    我正在将一些代码从 Objective C 迁移到 Swift 我想在 swift 中使用 SHA 256 算法用密钥加密字符串 但与 Objective C 实现的 swift 代码相比 返回不同的加密字符串 两个代码看起来相同 只是语法
  • 自定义文件格式和编解码器?

    我已经被编解码器问题弄乱了好几天了 但仍然看不到全局 这是我第一次处理音频 视频格式和编解码器 所以我真的需要一些帮助 这是工作 我正在编写几个负责编码和解码自定义 mpeg 文件的组件 在标准解 压缩过程 对于音频和视频 之上 我将实现一
  • 使用假会话测试控制器

    我想为我的控制器编写测试 Result changeAction callAction controllers routes ref Users changePassword assertThat status changeAction i
  • 将 Xtext 与 StringTemplate 代码生成器链接

    在我当前的项目中 我试图链接用 xtext 编写的 DSL 规范和用 StringTemplate 编写的代码生成器 例如 我的 DSL 规范的语法如下 我通过 xText 提供的优秀编辑器工具输入此信息 structs TempStruc
  • 如何在WinRT下并行线程中执行C++函数?

    我有一个 C 代码 它使用 beginthreadex Windows 方法在线程中执行函数 现在我想将其移植到 WinRT 组件以将其包含在 Windows Phone 应用程序中 但Windows Phone不支持 beginthrea