zoukankan      html  css  js  c++  java
  • MFC工作者线程

    //************工作者线程**************
    1.在头文件中添加UINT ThreadFunc(LPVOID lpParam); 注意应在类的外部

    2.添加protected型变量:CWinThread* pThread

    3.添加线程处理函数:
    UINT ThreadFunc(LPVOID lpParam)
    {
      while (true)
      {
      ...


        Sleep(1000);
      }
      return 0;
    }

    4.开启线程AfxBeginThread(ThreadFunc,lpParam);

    注意:用于控制线程循环的标志量在声明时要加上volatile,
    表示每次用到这个变量是都要从内存中读取


    因为Release模式下由于编译器优化,会把这个变量复制到寄存器,
    如果在线程外改变这个变量,寄存器中的不会改变,
    在线程中修改这个变量只会改变寄存其中的“副本”

    win32
    HANDLE WINAPI CreateThread(
      _In_opt_  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
      _In_      SIZE_T                 dwStackSize,
      _In_      LPTHREAD_START_ROUTINE lpStartAddress,
      _In_opt_  LPVOID                 lpParameter,
      _In_      DWORD                  dwCreationFlags,
      _Out_opt_ LPDWORD                lpThreadId
    );
    dwCreationFlags [in]
     : 0 创建后立即执行
       CREATE_SUSPENDED 线程挂起,直到调用ResumeThread后才开始执行
       STACK_SIZE_PARAM_IS_A_RESERVATION  、、、
    如:
    HANDLE hThread;
    DWORD dwThreadId;
    hThread = CreateThread(NULL, 0, ThreadFunc, (LPVOID)0, 0, &dwThreadId);
    //如果不用这个句柄,就CloseHandel(ThreadHandle ); 关闭句柄。
    //只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。
    //如改变优先级,被其他线程等待,强制TermateThread等就要使用这个句柄
    DWORD dwThreadExitCode;
    while (true)
    {
    GetExitCodeThread(hThread, &dwThreadExitCode);//得到线程退出码
    if (iThreadExitCode1 != STILL_ACTIVE)
     break;
    }
    TerminateThread(hThread, 0);

    //还可以使用_beginthreadex
    hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, &dwThreadId);
  • 相关阅读:
    2017第17周四当前工作中困境与挑战思考
    2017第17周三
    2017第17周二
    最小可行产品
    《穷查理宝典》中三条最重要的学习方法
    机场打车有感
    2017第15周五
    2017第15周四
    三条经济学原理帮你做出正确的选择
    Mac通过安装Go2Shell实现“在当前目录打开iTerm2”
  • 原文地址:https://www.cnblogs.com/xslwm/p/7173027.html
Copyright © 2011-2022 走看看