线程 进程学习之四 CreateThread AfxBeginThread

创建一个进程可以用CreateThread或AfxBeginThread,二者有什么优缺点...偶是菜鸟就不是很知道了,

只知道一点,CreateThread调用的Callback函数可以DWORD,而AfxBeginThread必须是UNIT类型的,不然就不能编译通过

使用CreateThread函数创建线程,CreateThread的原型如下:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags, // creation flags

LPDWORD lpThreadId

);

其中:

lpThreadAttributes表示创建线程的安全属性,NT下有用。

dwStackSize指定线程栈的尺寸,如果为0则与进程主线程栈相同。

lpStartAddress指定线程开始运行的地址。

lpParameter表示传递给线程的32位的参数。

dwCreateFlages表示是否创建后挂起线程(取值CREATE_SUSPEND),挂起后调用ResumeThread继续执行。

lpThreadId用来存放返回的线程ID。

用户界面线程的AfxBeginThread的原型如下:

CWinThread* AFXAPI AfxBeginThread(

CRuntimeClass* pThreadClass,

int nPriority,

UINT nStackSize,

DWORD dwCreateFlags,

LPSECURITY_ATTRIBUTES lpSecurityAttrs)

其中:

参数1是从CWinThread派生的RUNTIME_CLASS类;

参数2指定线程优先级,如果为0,则与创建该线程的线程相同;

参数3指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;

参数4是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。

参数5表示线程的安全属性,NT下有用。

// CreateThread.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <windows.h>

class CThread
{
public:
 CThread()
 {
  m_hThread = NULL;
  m_hEventExit = NULL;
 }
 virtual ~CThread()
 {
  if (m_hThread)
   CloseHandle(m_hThread);
  if (m_hEventExit)
   CloseHandle(m_hEventExit);
 }
 HANDLE CreateThread(void)
 {
  m_hEventExit = CreateEvent(NULL, TRUE, FALSE, NULL);
  if (!m_hEventExit)
   return NULL;
  
  m_hThread = ::CreateThread(
   NULL,
   0,
   ThreadProc,
   this,
   0,
   &m_dwThreadID);
  DWORD dwRet = GetLastError();
 }
 static DWORD WINAPI ThreadProc(LPVOID lpParameter)
 {
   CThread* pThread = reinterpret_cast<CThread *>(lpParameter);
   if (pThread)
    return pThread->Run();
   return -1;
 }
 virtual DWORD Run()
 {
  cout << "Run..." << endl;
  for (;;)
  {
   DWORD dwRet = WaitForSingleObject(m_hEventExit, 0);
   if (dwRet == WAIT_TIMEOUT)
   {
    cout << "Wait...." << endl;
    SuspendThread(m_hThread); //悬挂线程
    
    Sleep(10);
   }
   else if (dwRet == WAIT_OBJECT_0)
   {
    cout << "Wait_Object_0..." << endl;
    break;
   }
   else if (dwRet == WAIT_ABANDONED)
   {
    cout << "ABABDONED..." << endl;
    return -1;
   }
  }
  return 0;
 }
 void Wait(DWORD dwMillseconds = INFINITE)
 {
  //SetEvent(m_hEventExit);
  ResumeThread(m_hThread);//恢复线程
  WaitForSingleObject(m_hThread, dwMillseconds);
 }
private:
 HANDLE m_hThread;
 DWORD m_dwThreadID;
 HANDLE m_hEventExit;
};

int main(int argc, char* argv[])
{
 CThread ct;
 
 HANDLE handle = ct.CreateThread();
 Sleep(1000);
 ct.Wait();
 system("pause");
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值