如何正确给CreateThreadc thread 传递参数数

C++中线程的使用与参数传递
C++中线程的使用:线程的使用有多种方法,最常用的方法为CreateThread,CreateThrea的的参数详解如下:
HANDLE WINAPI CreateThread(
& __in_opt&&
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 指向SECURITY_ATTRIBUTES
的指针,为新线程指定安全描述
__in&&&&&&
SIZE_T dwStackSize, // 初始化线程堆栈尺寸
__in&&&&&&
LPTHREAD_START_ROUTINE lpStartAddress, //线程函数所指向的地址 起始函数
& __in_opt&&
LPVOID lpParameter, // 给线程函数传递的参数
__in&&&&&&
DWORD dwCreationFlags, // 有关线程的标志
& __out_opt& LPDWORD
lpThreadId //系统分配给线程的ID
&----第一个参数是安全属性,一般设为nil,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。
----第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。
----第三个参数,也是最重要的一个,是一个指向函数名的指针,但传递时很简单,只需在线程函数名前加上@就可以了。
----第四个参数是你需要向线程函数传递的参数,一般是一个指向结构的指针。不需传递参数时,则这个参数设为nil。
----第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配给CPU时间,只有当ResumeThread函数被调用后才能执行;当然,也可以调用SuspendThread函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被立即调用。一般传为0即可。
----第六个参数是系统分配给这个线程的唯一的ID标志
一般的,参数传递可以通过建立一个结构体,从而利用第四个参数,将所有要用到的参数传递给线程函数,代码实例如下:
& 1、定义结构体
<span STYLE="CoLor: # struct
THreadTest
<span STYLE="CoLor: #
<span STYLE="CoLor: #
<span STYLE="CoLor: #
<span STYLE="CoLor: #
2、声明线程执行函数
static DWORD WINAPI
Thread1(LPVOID
lpParameter);
  以上两步在头文件中进行,接下来,编写创建线程函数和完成线程函数体
3、声明线程
<span STYLE="CoLor: #
THreadTest *mythreadTest=new THreadTest();<span STYLE="CoLor: #&&&&
mythreadTest-&a=<span STYLE="CoLor: #;//给参数赋值
<span STYLE="CoLor: #&&&&
mythreadTest-&b=<span STYLE="CoLor: #;<span STYLE="CoLor: #&&&&&
m_thread=CreateThread(NULL,<span STYLE="CoLor: #,Thread1,mythreadTest,<span STYLE="CoLor: #,NULL);//创建线程
4、编写线程函数体,取出需要用到的参数进行计算
DWORD WINAPI
CTestThreadDlg::Thread1(LPVOID lpParameter)
&&&&THreadTest*
mythread=(THreadTest*)lpP//获取参数结构体
&&&&CString
&&&&print.Format("%d",mythread-&a);
&&&&mythread-&a;
&&&&//m_btn.SetWindowText("test");
&&&&AfxMessageBox(print);
&&&&return
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。CREATETHREAD用法详解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
CREATETHREAD用法详解
&&CREATETHREAD用法详解
你可能喜欢CreateThread(...)传入多个参数
MSDN中CreateThread原型:
  HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  DWORD dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId);
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows
略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
  dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆
栈的大小。
  lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是
必须以下列形式声明:
  DWORD WINAPI ThreadProc (LPVOID lpParam)
,格式不正确将无法调用成功。
  lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,
  dwCreationFlags :线程标志,可取值如下
  CREATE_SUSPENDED: 创建一个挂起的线程
  dwCreationFlags :0 表示创建后立即激活。
  lpThreadId:保存新线程的id。
  返回值:
  函数成功,返回线程句柄;函数失败返回false。
  函数说明:
  创建一个线程。
class & CThreadParam&
& IVMManager &
*m_pVMManager1;&
& CString &
m_strExtN&
& //要多少参数就有多少参数&
CThreadParam & *pParam & =
m_pVMManager1=...;&
DWORD & dwThreadId;&
CreateThread( &
NULL,0,ThreadFunc,pParam,0,&dwThreadId);&
DWORD & WINAPI &
CConnectDlg::ThreadFunc( & LPVOID
& lpParam &
//运行线程&
//强制指针类型转换&
(CThreadParam*)pMyParam & =
& (CThreadParam*)lpP&
//pMyParam-&
m_pVMManager1&
//pMyParam-&
m_strExtNum&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。随笔- 146&
&&&&&&&&&&&
当使用CreateProcess调用时,系统将创建一个进程和一个主线程。CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:  1在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回  2把线程退出码置为STILL_ACTIVE,把线程挂起计数置1  3分配context结构  4分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD  5lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数  6把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数语法:  hThread = CreateThread(&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
HANDLE CreateThread(& LPSECURITY_ATTRIBUTES lpThreadAttributes,&     // pointer to security attributes& DWORD dwStackSize,                  // initial thread stack size& LPTHREAD_START_ROUTINE lpStartAddress,&      // pointer to thread function& LPVOID lpParameter,                   // argument for new thread& DWORD dwCreationFlags,                // creation flags& LPDWORD lpThreadId                  // pointer to receive thread ID);
第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。第二个参数是用于新线程的初始堆栈大小,默认值为0。在任何情况下,Windows根据需要动态延长堆栈的大小。第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明:DWORD WINAPI ThreadProc (PVOID pParam) ;第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。第六个参数是一个指标,指向接受执行绪ID值的变量。&
注意:临界区要在线程执行前初始化,因为线程一但被建立即开始运行(除非手工挂起),但线程建立后在初始化临界区可能出现问题如:孙鑫MFC中的现象
int main() { InitializeCriticalSection(&g_cs); //先初始化临界区HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL); HANDLE handle2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL); CloseHandle(handle1); CloseHandle(handle2); Sleep(4000); DeleteCriticalSection(&g_cs); return 0; }
阅读(...) 评论()

我要回帖

更多关于 thread 传递参数 的文章

 

随机推荐