C++;使用params创建线程函数会导致转换错误 我在C++多线程中做了第一步,遇到了一个问题。 我想实现的是用参数设置任务,这些参数将在单独的线程中运行。 谷歌搜索答案并没有给我答案

C++;使用params创建线程函数会导致转换错误 我在C++多线程中做了第一步,遇到了一个问题。 我想实现的是用参数设置任务,这些参数将在单独的线程中运行。 谷歌搜索答案并没有给我答案,c++,multithreading,C++,Multithreading,我使用的系统由Windows 10 Pro和代码::Blocks 20.3和MinGW 17.1组成 我创建了一个简单的例子来感受它。 第一个示例(单个cpp文件)运行良好。 然而,第二个(在类中)有构建错误,即使我使用的是相同的代码 我希望有人能解释原因,并告诉我如何解决thsi 第一个(工作)示例: 只需将线程函数声明为静态函数: class-cthread-frame { 公众: void Start(){ m_hThread=(句柄)_beginthreadex( nullptr、0和C

我使用的系统由Windows 10 Pro和代码::Blocks 20.3和MinGW 17.1组成

我创建了一个简单的例子来感受它。 第一个示例(单个cpp文件)运行良好。 然而,第二个(在类中)有构建错误,即使我使用的是相同的代码

我希望有人能解释原因,并告诉我如何解决thsi

第一个(工作)示例:


只需将线程函数声明为静态函数:

class-cthread-frame
{
公众:
void Start(){
m_hThread=(句柄)_beginthreadex(
nullptr、0和CthreadFrame::DoSomething,
此/*存储参数在此处*/、0和m_uthreaid
);
}
私人:
静态无符号uu stdcall DoSomething(void*);
私人:
处理多线程;
未签名的m_uthreaid;
};

只需将线程函数声明为静态函数:

class-cthread-frame
{
公众:
void Start(){
m_hThread=(句柄)_beginthreadex(
nullptr、0和CthreadFrame::DoSomething,
此/*存储参数在此处*/、0和m_uthreaid
);
}
私人:
静态无符号uu stdcall DoSomething(void*);
私人:
处理多线程;
未签名的m_uthreaid;
};

谢谢乔治菲尔索夫

如果没有你的帮助,我绝对不会想到搜索std::msm_fn

我将代码更改为:

std::thread th(std::mem_fn(&CthreadFrame::DoSomething), std::ref(*this), (void *)&param );
th.join();

这就成功了。现在我可以将各种变量传递给线程函数。

谢谢Georgy Firsov

如果没有你的帮助,我绝对不会想到搜索std::msm_fn

我将代码更改为:

std::thread th(std::mem_fn(&CthreadFrame::DoSomething), std::ref(*this), (void *)&param );
th.join();

这就成功了。现在我可以将各种变量传递给线程函数。

使用
std::thread
。不要使用
\u stdcall
\u beginthread
句柄
和其他类似的废话
#include
提供
std::thread
和相关设施。将您的
CthreadFrame::DoSomething
声明为静态函数。使用
std::thread
。不要使用
\u stdcall
\u beginthread
句柄
和其他类似的废话
#include
提供
std::thread
和相关设施。将您的
CthreadFrame::DoSomething
声明为静态函数。感谢您的回答。std::thread导致错误:“静态断言失败:转换为右值后,必须对std::thread参数进行invocable”。静态声明导致“错误:无法声明成员函数‘static unsigned int-CthreadFrame::DoSomething(void*)具有静态链接[-fppermissive]|”@Ruud my answer提到
\u beginthreadex
,作为启动新线程的一种方式。如果要使用
std::thread
可以声明
DoSomething
为非静态,并使用
std::mem_fn
将其传递到
std::thread
std::thread th(std::mem_fn(&CthreadFrame::DoSomething),std::ref(*this),/*必要的参数*/)谢谢你的回答。std::thread导致错误:“静态断言失败:转换为右值后,必须对std::thread参数进行invocable”。静态声明导致“错误:无法声明成员函数‘static unsigned int-CthreadFrame::DoSomething(void*)具有静态链接[-fppermissive]|”@Ruud my answer提到
\u beginthreadex
,作为启动新线程的一种方式。如果要使用
std::thread
可以声明
DoSomething
为非静态,并使用
std::mem_fn
将其传递到
std::thread
std::thread th(std::mem_fn(&CthreadFrame::DoSomething),std::ref(*this),/*必要的参数*/)
||=== Build: Debug in Cthread (compiler: GNU GCC Compiler) ===|
F:\Data\__C++\wxApps\Cthread\CthreadMain.cpp||In member function 'void CthreadFrame::CreateThread()':|
F:\Data\__C++\wxApps\Cthread\CthreadMain.cpp|114|error: cannot convert 'unsigned int (CthreadFrame::*)(void*)' to '_beginthreadex_proc_type' {aka 'unsigned int (*)(void*)'}|
f:\sdks\mingw-17.1\x86_64-w64-mingw32\include\process.h|37|note:   initializing argument 3 of 'uintptr_t _beginthreadex(void*, unsigned int, _beginthreadex_proc_type, void*, unsigned int, unsigned int*)'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 2 second(s)) ===|
std::thread th(std::mem_fn(&CthreadFrame::DoSomething), std::ref(*this), (void *)&param );
th.join();