程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 多線程編程(2)-從CreateThread說起(2)

多線程編程(2)-從CreateThread說起(2)

編輯:Delphi

既然 CreateThread 可以返回一個句柄, 說明線程屬於 "內核對象".

實際上不管線程屬於哪個進程, 它們在系統的懷抱中是平等的; 在優先級(後面詳談)相同的情況下, 系統會在相同的時間間隔內來運行一下每個線程, 不過這個間隔很小很小, 以至於讓我們誤以為程序是在不間斷地運行.

這時你應該有一個疑問: 系統在去執行其他線程的時候, 是怎麼記住前一個線程的數據狀態的?

有這樣一個結構 TContext, 它基本上是一個 CPU 寄存器的集合, 線程是數據就是通過這個結構切換的, 我們也可以通過 GetThreadContext 函數讀取寄存器看看.

附上這個結構 TContext(或叫: CONTEXT、_CONTEXT) 的定義:PContext = ^TContext;
_CONTEXT = record
 ContextFlags: DWord;
 Dr0: DWord;
 Dr1: DWord;
 Dr2: DWord;
 Dr3: DWord;
 Dr6: DWord;
 Dr7: DWord;
 FloatSave: TFloatingSaveArea;
 SegGs: DWord;
 SegFs: DWord;
 SegEs: DWord;
 SegDs: DWord;
 Edi: DWord;
 Esi: DWord;
 Ebx: DWord;
 Edx: DWord;
 Ecx: DWord;
 Eax: DWord;
 Ebp: DWord;
 Eip: DWord;
 SegCs: DWord;
 EFlags: DWord;
 Esp: DWord;
 SegSs: DWord;
end;

CreateThread 的最後一個參數是 "線程的 ID";

既然可以返回句柄, 為什麼還要輸出這個 ID? 現在我知道的是:

1、線程的 ID 是唯一的; 而句柄可能不只一個, 譬如可以用 GetCurrentThread 獲取一個偽句柄、可以用 DuplicateHandle 復制一個句柄等等.

2、ID 比句柄更輕便.

在主線程中 GetCurrentThreadId、MainThreadID、MainInstance 獲取的都是主線程的 ID.

啰哩啰嗦一大些, 才說了 CreateThread 一個參數, 下篇繼續.

線程的學習還在入門中, 把我的理解寫在這, 最期望的收獲是得到指正.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved