C语言多线程编程

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,

                 DWORD dwStackSize,

                 LPTHREAD_START_ROUTINE lpStartAddress,

                 LPVOID lpParameter,

                 DWORD dwCreationFlags,

                 LPDWORD lpThreadId);

 

该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:

lpThreadAttributes:指向一个 SECURITY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL;

dwStackSize:指定了线程的堆栈深度,一般都设置为0;

lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是线程函数名;

lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;

dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;

lpThreadId:该参数返回所创建线程的ID;

如果创建成功则返回线程的句柄,否则返回NULL。

 

Xxxtpye m_data

 

 

hThread=CreateThread(NULL,

                   0,

                   (LPTHREAD_START_ROUTINE)ThreadFunc,

                   &m_data,

                   0,

                   NULL);

 

DWORD WINAPI ThreadFunc(LPVOID pParam)

{

         Xxxtype *p_data=(Xxxtype*)pParam;

 

 

  Return 0;

 

}

 

 

protected:

HANDLE hThread;

         DWORD ThreadID;

 

线程1

我们建立一MFC对话框工程,并添加一按键按键,在其中编写:

Sleep(5000),即休眠5秒,此时会感觉到程序像死机一样,不可拖动

 

1此时我们在对话框类中添加:

protected:

HANDLE hThread;

         DWORD ThreadID;

2在对话框源文件的开头添加:

DWORD WINAPI ThreadFunc(LPVOID pParam)

{

         Sleep(5000);

         return 0;

}

3将按键响应函数中的替换为:

         hThread=CreateThread(NULL,

                   0,

                   (LPTHREAD_START_ROUTINE)ThreadFunc,

                   NULL,

                   0,

                   &ThreadID

                   );

4此时再次编译运行程序,就会发现不那么“卡”了

 

注:本线程函数没有传递参数,故第3步的第4个参数为NULL

 

线程2

1以上线程函数是没有参数的,接下来传递一个参数,原工程不变,我们把线程函数改为如下形式

DWORD WINAPI ThreadFunc(LPVOID pParam)

{

         int *N=(int*)pParam;

         int i;

        

         for(i=0;i<*N;i++)

         {

                   Beep(1000,1000);

                   Sleep(100);

         }

//      Beep(1000,1000);

 

         return 0;

}

2将创建线程函数改为

int i=5;

hThread=CreateThread(NULL,

                   0,

                   (LPTHREAD_START_ROUTINE)ThreadFunc,

                   &i,

                   0,

                   &ThreadID

                   );

3再次运行,发现有时有声音,有时没有声音,那么我们再次修改2

int i=5;

        

         hThread=CreateThread(NULL,

                   0,

                   (LPTHREAD_START_ROUTINE)ThreadFunc,

                   &i,

                   0,

                   &ThreadID

                   );

         WaitForSingleObject(hThread,INFINITE);

4再次编译运行,点击按键后,是不听到有声音了

注:WaitForSingleObject函数,

其函数原型为:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);

当在某一线程中调用该函数时,线程暂时挂起,系统监视hHandle所指向的对象的状态。如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止

 

 

 

一个例子展开的多线程编程(linux)

Linux下的多线程编程

VC++多线程编程(Win)

Linux多线程编程

Linux多线程同步机制

MFC 多线程及线程同步

 

 

posted on 2013-08-14 21:19  鹰之翔  阅读(558)  评论(0编辑  收藏  举报

导航