【问题标题】:run function in separate thread in winapi c++ application在winapi C++应用程序的单独线程中运行函数
【发布时间】:2021-06-17 11:58:19
【问题描述】:

我需要在单独的线程中运行这个函数:

EdsError downloadEvfData(EdsCameraRef camera)
{
    EdsError err = EDS_ERR_OK;
    // some code skipped
}

我这样称呼这个函数:

HANDLE thread = CreateThread(NULL,0,downloadEvfData,camera,0,NULL);

但是得到这个错误:

invalid conversion from 'void (*)(EdsCameraRef)' {aka 'void (*)(__EdsObject*)'} to 'LPTHREAD_START_ROUTINE' {aka 'long unsigned int (__attribute__((stdcall)) *)(void*)'} 

我该如何解决?非常感谢!

【问题讨论】:

  • 是否允许使用 C++11 thread library,即std::threads?如果不是,为什么?另请参阅 QtPOCO
  • 是的,我可以使用 C++11 线程库

标签: c++ multithreading winapi edsdk


【解决方案1】:

您的 downloadEvfData 函数没有预期的 LPTHREAD_START_ROUTINE 签名,您可以这样做(如果 EdsCameraRef 是指针):

EdsError downloadEvfData(EdsCameraRef camera)
{
    EdsError err = EDS_ERR_OK;
    // some code skipped
}

DWORD ThreadProc(PVOID camera)
{
    downloadEvfData((EdsCameraRef)camera);
    return 0; // thread exit return
}


HANDLE thread = CreateThread(NULL, 0, ThreadProc, camera, 0, NULL);

【讨论】:

  • 谢谢!但是downloadEvfData((IUnknown*)camera); 得到这个错误:cannot convert 'IUnknown*' to 'EdsCameraRef' {aka '__EdsObject*'}
  • 刷新页面。我正在使用一些测试代码:-)
  • 很抱歉,这行 HANDLE thread = CreateThread(NULL, 0, ThreadProc, camera, 0, NULL); 现在出现此错误:invalid conversion from 'DWORD (*)(PVOID)' {aka 'long unsigned int (*)(void*)'} to 'LPTHREAD_START_ROUTINE' {aka 'long unsigned int (__attribute__((stdcall)) *)(void*)'} [-fpermissive]|
  • 这行不通,因为线程入口点必须使用stdcall 调用约定。通常使用WINAPI 宏声明。
  • @AntonVakulenko 我猜camera 不是指针,也许你需要尝试downloadEvfData(*((EdsCameraRef*)camera));。如果程序挂了,也许你需要显示a minimal, reproducible sample而不需要私人信息?
【解决方案2】:

EDSDK 的例子是这样创建线程的

static EdsError downloadEvfData(void* param)
{
    EdsError err = EDS_ERR_OK;
    EdsCameraRef camera = (EdsCameraRef)param;
    // some code skipped
}

HANDLE _hThread = (HANDLE)_beginthread(dowloadEvfData, 0, camera);

你可以使用c++11来创建一个这样的线程

std::unique_ptr<std::thread> pthd(nullptr);
pthd.reset(new std::thread([&]){
   downloadEvfData(camera);
})
pthd->join();

重要提示

//When using the SDK from another thread in Windows, 
// you must initialize the COM library by calling CoInitialize 
CoInitializeEx(NULL, COINIT_MULTITHREADED);
//....
CoUninitialize();

【讨论】:

    猜你喜欢
    • 2016-10-08
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2017-05-15
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多