2011-08-24 71 views
1

想,如果我通过CreateThread()创建5个线程。我需要intergers 1,2,3,4,5传递给每个线程,但我也必须通过this指针。我不能传递多个参数,因为CreateThread函数只接受一个参数,也不能在类中创建成员变量,因为它将在线程之间共享。如何做到这一点以及线程堆栈有多少数据?我如何将数据传递给不同的线程

+0

http://www.codeproject.com/Tips/117653/C-MFC-Use-a-Thread-Delegator-for-your-threads – Ajay

回答

4

定义一个结构,并通过这个结构的目的。

的结构可以是这样的:

struct ThreadContext 
{ 
    MyClass *m_this; 
    int  m_int; 
    //add more members you need to pass more data 
}; 

然后,你可以这样做:

for (int i = 0 ; i < 5 ; i++) 
{ 
    ThreadContext *ctx = new ThreadContext(); 
    ctx->m_this = this; 
    ctx->m_int = i ; 
    CreateThread(...., ThreadProc, ctx, ...); 
} 

确保你传递给每个线程的对象是不同的对象。这就是为什么我使用new并为每个线程创建一个对象。然后ThreadFunc内,使用static_cast为:

DWORD WINAPI ThreadProc(LPVOID lpParameter) 
{ 
    ThreadContext *ctx = static_cast<ThreadContext*>(lpParameter); 
    //use ctx 

    //... 

    //at the end of the thread, deallocate the memory! 
    delete ctx; 
} 

或者,你可以保持std::vector<ThreadContext>MyClass成员数据。

+2

好答案!谢谢。 – user675341

+0

你可以考虑使用'ThreadContext'结构的模板参数,并使用它来代替'MyClass',这会使它更通用。 – Ajay

1

也许创建包含该指针和整数的新的结构,并传递给线程,在该线程运行的功能适当地提取这些内容?

+0

我不明白为什么这是downvoted,下面的答案几乎说完全一样的东西。 – MGZero

+0

纳瓦兹的评论似乎是有后,我点击“发表新评论”,所以我认为他到了那里首先由几秒钟(与一个更全面的答复!)。 –

+0

是的,但没有必要downvote你。 – MGZero