• 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 多线程及线程同步

  • 相关阅读:
    一个java的进销存管理系统源码阅读
    嵌入式起步
    java数据库操作有关的杂记
    VS 调试
    软件测试的原则
    黑盒测试与白盒测试
    Xmind快速入门(基本操作够用了)
    opt目录
    日志测试
    bug的前世今生
  • 原文地址:https://www.cnblogs.com/gjianw217/p/3258511.html
Copyright © 2020-2023  润新知