1. 程式人生 > >windows api多線程

windows api多線程

mina 但是 指定 d參數 們的 argv amp 暫停 ros

線程是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。

以上來自百度百科。多線程技術會讓程序變得更加強大,是單線程永遠無法實現的。例如,在命令行中,用戶正在響應getchar函數,而我需要在用戶輸入的同時將命令行標題改為現在的時間,這個效果是單線程永遠不可能達到的。學習了本教程的內容,上面的例子就不難做到。

首先,認識API函數CreateThread:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  DWORD dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);

參數及其復雜,但事實上在普通的編程中大多數參數基本不需要用到。直接看示例代碼:

void Thread1()
{
  while(1)

  {

     system("title %time%");

  }
}

void main(int argc, char* argv[])
{
  HANDLE hThread;
  DWORD ThreadID;
  hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ThreadID);
  getchar();
}

(如果提示getchar未定義,請加入stdio.h頭文件)

是否實現了我們例子中想要的效果?讓我們來分析一下代碼。

  首先,在main函數中使用API函數CreateThread創建了一個線程,線程的內容就是執行Thread1函數(參數三),然後就到了getchar函數中等待用戶的輸入完成。而在此同時,剛剛創建的線程正在執行Thread1函數的內容,就是不斷地將命令行標題設置為當前時間。於是,我們的效果便達成了。

  CreateThread返回的是線程的HANDLE,示例代碼中是保存在hThread變量中。CreateThread會將第五個參數設置為線程的ID。線程的HANDLE和ID都是很重要的參數,對以後線程的其他操作有很重要的意義。

-----------------------------------------------------------------------分割線----------------------------------------------------------------------------------------------------------------------

CreateThread參數說明:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // [in,可選] 句柄是否可被繼承 ,為NULL則不可被繼承
  DWORD dwStackSize, //堆棧的初始大小,如為0系統自動分配
  LPTHREAD_START_ROUTINE lpStartAddress, //指向由線程執行的應用程序定義函數的指針。
  LPVOID lpParameter, //指向要傳遞給線程的變量的指針。
  DWORD dwCreationFlags, //控制線程創建的標誌。為0該線程在創建後立即運行;其它可選標誌看下文.
  LPDWORD lpThreadId //指向接收線程標識符的變量的指針。如果此參數為 NULL,則不返回線程標識符。
);

DWORD dwCreationFlags //可選標誌

  • 0 該線程在創建後立即運行。
  • CREATE_SUSPENDED(0x00000004) 該線程在掛起狀態下創建,並且不會運行,直到 ResumeThread函數被調用。
  • STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000) 在所述dwStackSize參數指定堆棧的初始保留大小。如果未指定此標誌,則dwStackSize指定提交大小。

-----------------------------------------------------------------------分割線----------------------------------------------------------------------------------------------------------------------

那麽,再介紹幾個API函數,這幾個函數比較簡單,請讀者們自由測試:

DWORD SuspendThread(
HANDLE hThread
);

這個是掛起線程的API函數,用於暫停線程的執行。參數為創建線程時返回的線程HANDLE。

DWORD ResumeThread(
HANDLE hThread
);

這個是繼續執行線程的API函數,用於將已經掛起的線程恢復執行,與SuspendThread對應。參數為創建線程時返回的線程HANDLE。

VOID ExitThread(
DWORD dwExitCode
);

這個是停止(銷毀)線程的API函數,只能在線程內部使用。參數為退出碼,一般可設為0。

BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);

這個是強行停止(銷毀)線程的API函數,能在程序的任意部分使用。但是使用這一API函數來終止線程是不安全的,可能造成程序不穩定。不推薦使用。參數一為創建線程時返回的線程HANDLE,參數二為退出碼,一般可設為0。

windows api多線程