C++的CreateThread實例


 

  function CreateThread(
  lpThreadAttributes: Pointer;           {安全設置}
  dwStackSize: DWORD;                    {堆棧大小}
  lpStartAddress: TFNThreadStartRoutine; {入口函數}
  lpParameter: Pointer;                  {函數參數}
  dwCreationFlags: DWORD;                {啟動選項}
  var lpThreadId: DWORD                  {輸出線程 ID }
): THandle; stdcall;                     {返回線程句柄}

1、返回值:返回線程句柄
"句柄" 類似指針, 但通過指針可讀寫對象, 通過句柄只是使用對象;
有句柄的對象一般都是系統級別的對象(或叫內核對象); 之所以給我們的是句柄而不是指針, 目的只有一個: "安全";
貌似通過句柄能做很多事情, 但一般把句柄提交到某個函數(一般是系統函數)后, 我們也就到此為止很難了解更多了; 事實上是系統並不相信我們.

不管是指針還是句柄, 都不過是內存中的一小塊數據(一般用結構描述), 微軟並沒有公開句柄的結構細節, 猜一下它應該包括: 真實的指針地址、訪問權限設置、引用計數等等.

既然 CreateThread 可以返回一個句柄, 說明線程屬於 "內核對象".
實際上不管線程屬於哪個進程, 它們在系統的懷抱中是平等的; 在優先級(后面詳談)相同的情況下, 系統會在相同的時間間隔內來運行一下每個線程, 不過這個間隔很小很小, 以至於讓我們誤以為程序是在不間斷地運行.

 

//ThreadBase.h<br>#pragma once
#include<windows.h>
class CThreadBase
{
public:
    CThreadBase(void);
    ~CThreadBase(void);
    static DWORD WINAPI ThreadProc (PVOID pParam);
    virtual void Run() = 0;
    void Start();
 
private:
    HANDLE m_hThread;
    DWORD  m_dwThreadID;
};

 

//ThreadBase.cpp
 
#include "StdAfx.h"
#include "ThreadBase.h"
 
CThreadBase::CThreadBase(void)
{
    m_hThread = CreateThread(NULL,0,ThreadProc,this,CREATE_SUSPENDED,&m_dwThreadID);
}
 
CThreadBase::~CThreadBase(void)
{
    CloseHandle(m_hThread);
}
DWORD WINAPI CThreadBase::ThreadProc (PVOID pParam)
{
 
    if (NULL!=pParam)
    {
        ((CThreadBase*)pParam)->Run();
    }
    return 0;
}
void CThreadBase::Start()
{
    ResumeThread(m_hThread);
}

 參考文獻:

采用CreateThread()創建多線程程序

CreateThread用法詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM