2013-01-10 55 views
0
螺纹

可能重复:
Passing parameters to _beginthreadexC++我怎么能叫带参数

如何使用beginthreadex作为TestFunction2包含3个额外的参数

我打电话 TestFunction2而不是 TestFunction1ExecuteLocalThread
unsigned __stdcall TestFunction1(void* timerPointer) 
{ 
    unsigned result =0; 
    printf("thread is running\n"); 
    return result; 
} 

unsigned __stdcall TestFunction2(void* timerPointer, wchar_t *appId, wchar_t *userName, wchar_t *password) 
{ 
    unsigned result =0; 
    printf("thread is running\n"); 
    return result; 
} 

void ExecuteLocalThread() 
{ 
    HANDLE heartBeatThread; 
    unsigned int hbThreadID; 
    heartBeatThread = (HANDLE)_beginthreadex(NULL, 0 , &TestFunction1, (void*)this, CREATE_SUSPENDED, &hbThreadID); 
    ResumeThread(heartBeatThread); 
} 
+0

可能的重复:http://stackoverflow.com/questions/5968076/passing-parameters-to-beginthreadex – Caribou

回答

3

创建一个包含所有你想要传递,然后一个指针传递到你的线程入口点

typedef struct MyThreadData { 
    void* timerPointer; 
    wchar_t *appId; 
    wchar_t *userName; 
    wchar_t *password; 
}; MyThreadData 


unsigned int hbThreadID; 
void* threadData = calloc(1, sizeof(*threadData)); 
/* populate threadData */ 
heartBeatThread = (HANDLE)_beginthreadex(NULL, 0, 
           &TestFunction1, threadData, 
           CREATE_SUSPENDED, &hbThreadID); 


unsigned __stdcall TestFunction1(void* ptr) { 
    MyThreadData* threadData = (MyThreadData*)ptr; 
    unsigned result; 
    printf("thread is running\n"); 
    result = TestFunction2(ptr->timerPointer, ptr->appId, ptr->userName, ptr->password); 
    free(threadData); 
    return result; 
} 

unsigned __stdcall TestFunction2(void* timerPointer, wchar_t *appId, wchar_t *userName, wchar_t *password) { 
    unsigned result =0; 
    return result; 
} 
+0

谢谢simonc,但这是行不通的。 – Shahzad

+0

result = TestFunction2(ptr-> timerPointer,ptr-> appId,ptr-> userName,ptr-> password)这两个词(“ptr->”和“&TestFunction2” )在以下两行代码中存在问题 result = ; (HANDLE)_beginthreadex(NULL,0, &TestFunction2,(void *)threadData, CREATE_SUSPENDED,&hbThreadID); – Shahzad

+0

@ user1482702我建议的代码中有一个重要的错字。一定要将&TestFunction1传入_beginthreadex – simonc

8

使用C++ 11个线程的数据结构:

std::thread thr(func, arg0, arg1, arg2); 
+1

这是唯一明智的解决方案 –

0

创建一个结构的建议作品。如果代码是一个类内部和类已经包含了信息,你可以使用,也:

unsigned __stdcall TestFunctionProxy(void* p) 
{ 
    assert(p); 
    MyClass* c = static_cast<MyClass*>(p); 
    c->TestFunction(); 
    return 0; 
} 

如果这不起作用,因为TestFunction()是私有的,使它成为一个友元函数。 BTW:在暂停状态下启动一个线程,然后释放它是不必要的。直接启动线程。

最后,请记住,使用适当的C++线程库(例如, Boost.Thread将使这更加灵活,并为您的问题提供解决方案,以便如何传递更多参数。