windows api多線程

來源:互聯網
上載者:User

標籤:命令   控制   線程   代碼   term   參數設定   工作   argv   存在   

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

以上來自百度百科。多線程技術會讓程式變得更加強大,是單線程永遠無法實現的。例如,在命令列中,使用者正在響應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多線程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.