全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1613
推到 Plurk!
推到 Facebook!

★线程使用★

尚未結案
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-22 09:00:22 IP:61.155.xxx.xxx 未訂閱
1.线程的定义 2.线程的操作 3.线程派生的类型详细解释及源码 4.程序中线程的最佳数量 5.在程序中是否应该使用线程?
------
风花雪月 e梦情缘
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-23 20:51:07 IP:61.216.xxx.xxx 未訂閱
建議 搜尋引擎 先找找!~ < src="http://simg3.pchome.com.tw/simage/thumbnail/3628/home.kimo.com.tw£¯angelbeach2002£¯qoo£¯angel_qoo.gif">
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-23 21:28:07 IP:61.64.xxx.xxx 未訂閱
1.線程的定義 2.線程的操作 3.線程派生的類型詳細解釋及源碼 4.程式中線程的最佳數量 5.在程式中是否應該使用線程? 我想 思科 最知道把 哈哈 開玩笑的 1 2 4 5 問題都是理論加實做 3 的部份 是實現的東西 wnhoo 兄 應該是 固中高手 哈哈 我不會不過不知道是否有人 願意解說一下 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-24 01:06:36 IP:61.216.xxx.xxx 未訂閱
使用Delphi 4.0編寫多執行緒 1.介绍 VCL提供几个对象以方便编写多线程应用。使用多线程可以避开一些性能的瓶颈。使用不同优先权的线程可以给重要的任务更多的CPU时间。在多处理器机器上,使用多个线程并将不同的线程放在不同的处理器上运行,将会提高应用的性能。当有相应的底层硬件时,NT操作系统支持真正的多线程,而即使底层硬件支持多处理器,95也只能模拟多线程的运行。 2.定义线程对象 对于大多数应用,可以使用线程对象来表示一个执行的线程。线程对象封装线程必需的应用,简化了多线程的编写。 注意:多线程对象并不允许泥控制线程的安全属性或栈的大小。如果需要控制这些,必须使用BeginThread函数。即使使用BeginThread,仍然能从一些线程同步的对象和在定位相差的方法中获取好处。 为了在应用中使用线程对象,首先必须产生一个TThread的继承对象。在file|new菜单中选择Thread Object创建。 新产生的Thread Object 包括一个框架代码,以下是一个名为TMyThread的线程: unit Unit2; interface uses Classes; type TMyThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; implementation { TMyThread } procedure TMyThread.Execute; begin { Place thread code here } end; end. 在自动产生的unit文件中,你应该: l (可选)初始化线程 l 填写Execute方法,编写线程函数 l (可选)编写清除代码 3.初始化线程 如果你要为线程编写初始化代码,必须重载Create方法。在线程的声明中加入一个新的构造函数,并在它的实现中编写初始化代码。在这里你能够为线程设置一个缺省的优先级和当它执行完毕时,是否应该自动的释放。 3.1 设置一个缺省的优先级 优先级分为7级,如下表所示: TpIdle The thread executes only when the system is idle. Windows won't interrupt other threads to execute a thread with tpIdle priority. TpLowest The thread's priority is two points below normal. TpLower The thread's priority is one point below normal. TpNormal The thread has normal priority. TpHigher The thread's priority is one point above normal. TpHighest The thread's priority is two points above normal. TpTimeCritical The thread gets highest priority. 警告:一味地提高对CPU敏感的操作的线程的优先级会饿死其它线程。应该提高那些经常等待外部事件的线程的优先级。以下的代码表示一个低优先级的执行后台任务的线程,它在其它的时间内不会打扰应用的执行。 constructor TMyThread.Create(CreateSuspended: Boolean); { inheritedCreate(CreateSuspended); Priority := tpIdle; } 3.2 指明线程的释放 一般情况下,线程只会被执行一次,在这种情况下,特别方便让线程释放它自身,只要简单的将FreeOnTerminate特性置为true。如果需要多次运行,或同一个线程的多个实例,你可以缓存线程以提高性能,这时,将FreeOnTerminate特性置为false。 4.编写Execute方法 Execute方法是线程的函数。泥可以将它想象成一个由你的应用启动的程序,只是它共享了同样的进程空间。写线程函数稍微要注意一点是要确信没有写其他进程使用的内存,另外,你优可以使用共享内存在不同的线程之间通信,因为它们是在同一个进程空间中。 4.1 使用主VCL线程 当你使用从VCL继承过来的对象,他们的特性和方法并不能保证是线程安全的,即,访问特性货方法也许会执行一些使用一些没有被其他线程保护的内存。因此,为VCL对象的访问设了一个主VCL线程。这是处理应用程序中组件接收的所有的Windows消息的线程。 如果所有对象是在同一个线程中访问特性和方法,就不必担心会发生冲突。为了使用主VCL线程,产生一个分离的过程来执行需求的操作,在你的线程中使用Synchronize方法来调用这个分离的过程。如: procedureTMyThread.PushTheButton; begin Button1.Click; end; procedure TMyThread.Execute; begin .... Synchronize(PushTheButton); .... end; Synchronize等待主VCL线程进入消息循环,然后执行相应的方法数据访问组件和图形组件都是线程安全的,不需要使用主VCL线程。 4.2 Thread-local变量 Thread-local变量是一种线程内的全局的变量,但是并不与其他的线程实例共享。声明thread-local变量是在threadvar区中声明,如: threadvar x : integer; threadvar区只适用于全局变量。 5. 编写清除代码(Clean-up Code) 线程结束时执行的清除代码可以集中起来。当线程关闭前,一个OnTerminate事件发生。将清除代码都放在OnTerminate事件的处理代码中,这样,这些代码就总会被执行。 OnTerminate事件处理并不是作为线程的一部分运行,它是在主VCL线程环境(Context)下运行。有两个含义:在OnTerminate事件处理中不能使用任何线程局部变量可以安全的访问任何组件和VCL对象,而不必担心会与其它的线程冲突 6.避免同时访问 为了避免与其他线程在访问一个全局对象货变量时发生冲突,需要在执行线程代码时锁定其他线程的执行,直至完成操作。VCL支持三种技术来达到这个目的: (1) 锁定对象:有些对象自己有锁定的功能,如canvas (2) 使用critical区 如果对象没有提高内置的锁定功能,需要使用critical区,Critical区在同一个时间只也许一个线程进入。为了使用Critical区,产生一个TCriticalSection全局的实例。TcriticalSection有两个方法,Acquire(阻止其他线程执行该区域)和Release(取消阻止) 每个Critical区是与你想要保护的全局内存相关联。每个访问全局内存的线程必须首先使用Acquire来保证没有其他线程使用它。完成以后,线程调用Release方法,让其他线程也可以通过调用Acquire来使用这块全局内存。 警告:Critical区只有在所有的线程都使用它来访问全局内存,如果有线程直接调用内存,而不通过Acquire,会造成同时访问的问题。例如:LockXY是一个全局的Critical区变量。任何一个访问全局X, Y的变量的线程,在访问前,都必须使用Acquire LockXY.Acquire; { lock out other threads } try Y := sin(X); finally LockXY.Release; end; (3) 使用multi-read exclusive-write synchronizer 当你使用critical区保护全局内存时,同一个时间内只允许一个线程使用这块内存。这也许会超过你的要求,特别是对于那些经常读而很少写的对象或变量。在多线程内,当没有线程对同样的内存进行写操作时,同时读它是没有任何问题。当你有一些全局变量需要经常读而很少写时,可以使用TmultiReadExclusiveWriteSynchronizer保护它们。这个对象象Critical section, 但是当内存没有线程在写它时,允许多个线程读取一个内存。 为了使用multi-read exclusive-write synchronizer,产生一个全局的 TmultiReadExclusiveWriteSynchronizer实例,与你想要保护的内存相关联。每个线程如果项读取该内存,必须先调用BeginRead方法。它确信没有其他的线程在写内存。读完后,调用EndRead。写内存时,调用BeginWrite,写完后,调用 EndWrite。 警告:同Critical section一样,multi-read exclusive-write synchronizer也只有在所有的线程都使用它访问同一块全局内存时才有效。直接访问该内存将会导致同时访问问题。 7.线程对象的执行 使用线程时,首先产生一个线程的实例,可以立刻开始运行线程,也可以开始把它置于挂起(Suspended)状态,以后使用Resume方法运行它。将构造函数中的CreateSuspended参数置为false,线程将创建后立刻运行,如:SecondProcess := TMyThread.Create(false); {create and run the thread }一般在单处理器的机器上,一个进程适合产生16个线程,如果线程都在运行,那么线程的数目要更少一些。 暂停线程:调用suspend 恢复线程:调用resume 终止线程:调用Terminate,它将线程的Terminated特性置为true。如果Execute编写合理,它将周期性检查Terminated,当Terminated为True时,将终止线程的执行。如: procedure TMyThread.Execute; begin while not Terminated do PerformSomeTask; end; 缓存线程 当应用需要同一个线程的多个实例(多次运行一个线程),可以缓存线程,以后重用,以提高性能,而不是每次创建一个新的线程。为了缓存线程,使用一个线程列表来维护线程。
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-24 01:07:50 IP:61.216.xxx.xxx 未訂閱
使用Delphi 4.0編寫多執行緒    1.介紹  VCL提供幾個物件以方便編寫多多執行緒應用。使用多多執行緒可以避開一些性能的瓶頸。使用不同優先權的多執行緒可以給重要的任務更多的CPU時間。在多處理器機器上,使用多個多執行緒並將不同的多執行緒放在不同的處理器上執行,將會提高應用的性能。當有相應的底層硬件時,NT操作系統支持真正的多多執行緒,而即使底層硬件支持多處理器,95也只能模擬多多執行緒的執行。     2.定義多執行緒物件  對於大多數應用,可以使用多執行緒物件來表示一個執行的多執行緒。多執行緒物件封裝多執行緒必需的應用,簡化了多多執行緒的編寫。      注意:多多執行緒對象並不允許泥控制多執行緒的安全屬性或棧的大小。如果需要控制這些,必須使用BeginThread函數。即使使用BeginThread,仍然能從一些多執行緒同步的對象和在定位相差的方法中獲取好處。      為了在應用中使用多執行緒對象,首先必須產生一個TThread的繼承對象。在file|new選單中選擇Thread Object創建。      新產生的Thread Object 包括一個框架程式碼,以下是一個名為TMyThread的多執行緒:  unit Unit2;     interface  uses  Classes;  type  TMyThread = class(TThread)  private  { Private declarations }  protected  procedure Execute; override;  end;  implementation  { TMyThread }  procedure TMyThread.Execute;  begin  { Place thread code here }  end;  end.     在自動產生的unit檔案中,你應該:  l (可選)初始化多執行緒  l 填寫Execute方法,編寫多執行緒函數  l (可選)編寫清除程式碼     3.初始化多執行緒      如果你要為多執行緒編寫初始化程式碼,必須重載Create方法。在多執行緒的聲明中加入一個新的構造函數,並在它的實現中編寫初始化程式碼。在這裡你能夠為多執行緒設置一個缺省的優先級和當它執行完畢時,是否應該自動的釋放。     3.1 設置一個缺省的優先級  優先級分為7級,如下表所示:     TpIdle The thread executes only when the system is idle. Windows won't  interrupt other threads to execute a thread with tpIdle priority.     TpLowest The thread's priority is two points below normal.     TpLower The thread's priority is one point below normal.     TpNormal The thread has normal priority.  TpHigher The thread's priority is one point above normal.  TpHighest The thread's priority is two points above normal.  TpTimeCritical The thread gets highest priority.      警告:一味地提高對CPU敏感的操作的多執行緒的優先級會餓死其它多執行緒。應該提高那些經常等待外部事件的多執行緒的優先級。以下的程式碼表示一個低優先級的執行後台任務的多執行緒,它在其它的時間內不會打擾應用的執行。  constructor TMyThread.Create(CreateSuspended: Boolean);  {  inheritedCreate(CreateSuspended);  Priority := tpIdle;  }     3.2 指明多執行緒的釋放  一般情況下,多執行緒只會被執行一次,在這種情況下,特別方便讓多執行緒釋放它自身,只要簡單的將FreeOnTerminate特性置為true。如果需要多次執行,或同一個多執行緒的多個實例,你可以緩存多執行緒以提高性能,這時,將FreeOnTerminate特性置為false。     4.編寫Execute方法  Execute方法是多執行緒的函數。泥可以將它想像成一個由你的應用啟動的程式,只是它共享了同樣的進程空間。寫多執行緒函數稍微要注意一點是要確信沒有寫其他進程使用的記憶體,另外,你優可以使用共享記憶體在不同的多執行緒之間通信,因為它們是在同一個進程空間中。     4.1 使用主VCL多執行緒  當你使用從VCL繼承過來的對象,他們的特性和方法並不能保證是多執行緒安全的,即,訪問特性貨方法也許會執行一些使用一些沒有被其他多執行緒保護的記憶體。因此,為VCL對象的訪問設了一個主VCL多執行緒。這是處理應用程式中元件接收的所有的Windows消息的多執行緒。 如果所有對象是在同一個多執行緒中訪問特性和方法,就不必擔心會發生衝突。為了使用主VCL多執行緒,產生一個分離的程序來執行需求的操作,在你的多執行緒中使用Synchronize方法來調用這個分離的程序。如:  procedureTMyThread.PushTheButton;     begin  Button1.Click;  end;  procedure TMyThread.Execute;  begin  ....  Synchronize(PushTheButton);  ....  end;      Synchronize等待主VCL多執行緒進入消息迴圈,然後執行相應的方法資料訪問元件和圖形元件都是多執行緒安全的,不需要使用主VCL多執行緒。     4.2 Thread-local變數  Thread-local變數是一種多執行緒內的全局的變數,但是並不與其他的多執行緒實例共享。聲明thread-local變數是在threadvar區中聲明,如:  threadvar  x : integer;  threadvar區只適用於全局變數。     5. 編寫清除程式碼(Clean-up Code)  多執行緒結束時執行的清除程式碼可以集中起來。當多執行緒關閉前,一個OnTerminate事件發生。將清除程式碼都放在OnTerminate事件的處理程式碼中,這樣,這些程式碼就總會被執行。      OnTerminate事件處理並不是作為多執行緒的一部分執行,它是在主VCL多執行緒環境(Context)下執行。有兩個含義:在OnTerminate事件處理中不能使用任何多執行緒局部變數可以安全的訪問任何元件和VCL對象,而不必擔心會與其它的多執行緒衝突     6.避免同時訪問      為了避免與其他多執行緒在訪問一個全局物件貨變數時發生衝突,需要在執行多執行緒程式碼時鎖定其他多執行緒的執行,直至完成操作。VCL支持三種技術來達到這個目的:  (1) 鎖定物件:有些物件自己有鎖定的功能,如canvas  (2) 使用critical區  如果物件沒有提高內置的鎖定功能,需要使用critical區,Critical區在同一個時間只也許一個多執行緒進入。為了使用Critical區,產生一個TCriticalSection全局的實例。TcriticalSection有兩個方法,Acquire(阻止其他多執行緒執行該區域)和Release(取消阻止)      每個Critical區是與你想要保護的全局記憶體相關聯。每個訪問全局記憶體的多執行緒必須首先使用Acquire來保證沒有其他多執行緒使用它。完成以後,多執行緒調用Release方法,讓其他多執行緒也可以通過調用Acquire來使用這塊全局記憶體。      警告:Critical區只有在所有的多執行緒都使用它來訪問全局記憶體,如果有多執行緒直接調用記憶體,而不通過Acquire,會造成同時訪問的問題。例如:LockXY是一個全局的Critical區變數。任何一個訪問全局X, Y的變數的多執行緒,在訪問前,都必須使用Acquire  LockXY.Acquire; { lock out other threads }  try  Y := sin(X);  finally  LockXY.Release;  end;  (3) 使用multi-read exclusive-write synchronizer  當你使用critical區保護全局記憶體時,同一個時間內只允許一個多執行緒使用這塊記憶體。這也許會超過你的要求,特別是對於那些經常讀而很少寫的對象或變數。在多多執行緒內,當沒有多執行緒對同樣的記憶體進行寫操作時,同時讀它是沒有任何問題。當你有一些全局變數需要經常讀而很少寫時,可以使用TmultiReadExclusiveWriteSynchronizer保護它們。這個對象象Critical section, 但是當記憶體沒有多執行緒在寫它時,允許多個多執行緒讀取一個記憶體。      為了使用multi-read exclusive-write synchronizer,產生一個全局的 TmultiReadExclusiveWriteSynchronizer實例,與你想要保護的記憶體相關聯。每個多執行緒如果項讀取該記憶體,必須先調用BeginRead方法。它確信沒有其他的多執行緒在寫記憶體。讀完後,調用EndRead。寫記憶體時,調用BeginWrite,寫完後,調用 EndWrite。  警告:同Critical section一樣,multi-read exclusive-write synchronizer也只有在所有的多執行緒都使用它訪問同一塊全局記憶體時才有效。直接訪問該記憶體將會導致同時訪問問題。     7.多執行緒對象的執行  使用多執行緒時,首先產生一個多執行緒的實例,可以立刻開始執行多執行緒,也可以開始把它置於掛起(Suspended)狀態,以後使用Resume方法執行它。將構造函數中的CreateSuspended參數置為false,多執行緒將創建後立刻執行,如:SecondProcess := TMyThread.Create(false); {create and run the thread }一般在單處理器的機器上,一個進程適合產生16個多執行緒,如果多執行緒都在執行,那麼多執行緒的數目要更少一些。  暫停多執行緒:調用suspend  恢復多執行緒:調用resume  終止多執行緒:調用Terminate,它將多執行緒的Terminated特性置為true。如果Execute編寫合理,它將週期性檢查Terminated,當Terminated為True時,將終止多執行緒的執行。如:  procedure TMyThread.Execute;     begin  while not Terminated do  PerformSomeTask;  end;     緩存多執行緒  當應用需要同一個多執行緒的多個實例(多次執行一個多執行緒),可以緩存多執行緒,以後重用,以提高性能,而不是每次創建一個新的多執行緒。為了緩存多執行緒,使用一個多執行緒列表來維護多執行緒。        
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-24 17:29:33 IP:61.155.xxx.xxx 未訂閱
谢谢各位的回答!!! 希望我的话题,可以为各位起到“抛砖引玉”的作用吧!!! 资源共享ma ? 风花雪月 e梦情缘
------
风花雪月 e梦情缘
系統時間:2024-04-29 17:10:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!