gpt4 book ai didi

c++ - 使用时如何传递参数::AfxBeginThread(ThreadFunc, &INDEX);

转载 作者:行者123 更新时间:2023-11-30 05:42:49 26 4
gpt4 key购买 nike

我在 MFC 中使用::AfxBeginThread 时遇到问题。

我试着创建一个线程,这是我的代码。

void CMyoControllerView::OnCbnSelchangeComboFist()
{
int nIndex = m_combo_Fist.GetCurSel();
int INDEX;

if(nIndex != CB_ERR){
CString str;
m_combo_Fist.GetLBText(nIndex, str);

if(str == "Left Click") {
INDEX = 0;
} else if(str == "Double Click") {
INDEX = 1;
} else if(str == "Right Click") {
INDEX = 2;
} else if(str == "Wheel Click") {
INDEX = 3;
} else {
INDEX = 4;
}
pThread_Fist = ::AfxBeginThread(ThreadFunc, &INDEX);
}
}

ThreadFunc 函数是...

UINT CMyoControllerView::ThreadFunc(LPVOID pParam)
{
int index= (int)pParam;
if(index == 0) { }
else if(index == 1) { }
...

}

::AfxBeginThread(ThreadFunc, &INDEX)); 有问题

我想传递一个参数给“INDEX”(可能的值:0~4)。

但是,当我调试这段代码时,ThreadFunc 中的“index”变量中存在垃圾值。 (取值范围为0~4)

我尝试使用 reinterpret_cast 、 reinterpret_cast 等。但我无法获得正确的值(value)。

我应该更改什么才能在“index”变量中获得正确的值?

(ps。我不确定,但我认为这可能是 x64 或 x86 问题。所以我搜索了谷歌,但一无所获。我使用的是 Windows 8 x64。)

最佳答案

您传递参数 INDEX 的方式很好。您遇到的问题是同步问题之一:INDEX 是一个自动变量,当它超出范围时即变得无效,即就在 CMyoControllerView::OnCbnSelchangeComboFist 返回之前。那时你的线程可能还没有读取变量,一旦读取,它就会看到垃圾。另外,您在尝试读取 int* 值时将其重新解释为 int 值,因此您的 index 变量是数字INDEX 变量的地址值。

解决方案是实现同步。请求创建一个新线程后,你必须等待它读取传递给它的数据。一种解决方案是使用事件。

创建全局 event同步线程启动的对象:

HANDLE g_hThreadRunning = ::CreateEvent( NULL, FALSE, FALSE, NULL );

更改您的线程创建代码以等待线程发出信号,它已完成读取数据(WaitForSingleObject):

void CMyoControllerView::OnCbnSelchangeComboFist() {

// ...

pThread_Fist = ::AfxBeginThread( ThreadFunc, &INDEX );
::WaitForSingleObject( g_hThreadRunning, INFINITE );
}

在您的线程过程中,将同步对象设置为有信号,当完成读取数据时 (SetEvent)。请注意,您必须以与传递参数时相同的方式解释 pParam,即作为 int*:

UINT CMyoControllerView::ThreadFunc( LPVOID pParam ) {   
int index = *static_cast<int*>( pParam );
::SetEvent( g_hThreadRunning );

if(index == 0) { }
else if(index == 1) { }
// ...
}


另一种方法是让 pParam 指针参数改为携带 int:

pThread_Fist = ::AfxBeginThread( ThreadFunc, reinterpret_cast<void*>( INDEX ) );

ThreadFunc 中:

int index = reinterpret_cast<int>( pParam );

由于这是按值 传递参数,因此您不需要任何同步。然而,这并不普遍适用。特别是,它可能会在某些平台上失败。它不能保证有效(尽管它适用于所有运行 Windows 的平台今天)。

关于c++ - 使用时如何传递参数::AfxBeginThread(ThreadFunc, &INDEX);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30500780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com