作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 C++ 代码,它使用 _beginthreadex() Windows 方法在线程中执行函数。现在我想将它移植到 WinRT 组件以将其包含在 Windows Phone 应用程序中。但是windows phone 不支持_beginthreadex()。我该怎么做?
我的职能是:
bool doesWordAppearInDictionarry(char* word);
我的计算机上有 4 个内核,所以我想并行执行此函数的 4 个拷贝(同时在字典中搜索 4 个不同的词)。
我阅读了 ( here ) 和 ( here ) 关于 Windows::System::Threading::WorkItemHandler
、ThreadPool
和 IAsyncAction
但是提供的示例激活托管代码并且不调用 native 函数。
我正在寻找的是一个干净的解决方案(代码行数最少),它将取代我当前的 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 ) 博客的堆栈溢出答案 ( this)。该博客包括一个完整的线程仿真,包括 CreateThread() Win32 api,在线程运行时访问线程并在线程之间共享内存。我的解决方案是完整模拟器的简化案例。
附言调用方方法必须等待使用 WaitForSingleObjectEx(
) 方法而不是 WaitForSingleObject()
关于c++ - 如何在 WinRT 下的并行线程中执行 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20935825/
我是一名优秀的程序员,十分优秀!