1. 程式人生 > >Delphi中多執行緒中Synchronize的運用

Delphi中多執行緒中Synchronize的運用

Delphi中多執行緒用Synchronize實現VCL資料同步顯示,Delphi中多執行緒用Synchronize實現VCL資料同步顯示

轉自:http://blog.csdn.net/maxcode/archive/2006/05/12/726766.aspx

概述:        

VCL實現同步的另一種方法就是呼叫執行緒類的Synchronize的過程,此過程需要一個無引數的procedure,故在此procedure中無法傳遞引數值,但可以通過類的成員來實現。在類的Execute中只須呼叫Synchronize就可以了。

實現:      

         關鍵在於對Synchronize引數的定義。定義一個無引數的procedure通過它來訪問類的成員變數szName和nIndex。在類的過載Execute中呼叫Synchronize。子類的定義如下:
unit

TChildThread;

interfaceuses =Classes,

Messages,Windows,SysUtils;

const MAX_LEN = 260;

typeTChildThreads = class(TThread)

private      { Private declarations }protectedprocedure Execute; override;//同步函式的宣告
procedure UpdateData;

public      

szName : array[0..MAX_LEN] of Char;  

nIndex : Integer;end;implementationuses         

Unit1;

{ Important: Methods and properties of objects in VCL or CLX can only be usedin a method called using Synchronize, for example,        

Synchronize(UpdateCaption);

and UpdateCaption could look like,      

procedure TChildThread.UpdateCaption;     

begin        

Form1.Caption := 'Updated in a thread';      

end; }{ TChildThread }//同步函式的實現procedure TChildThreads.UpdateData;begin         Form1.ShowData.Items.Add(PChar(@szName));

end;

procedure TChildThreads.Execute;

begin{ Place thread code here }//呼叫同步過程

Synchronize(UpdateData);

end;

end.


主程的設計與《Delphi中多執行緒用訊息實現VCL資料同步顯示》基本一致,但為了與其顯示相同結果,在生成子執行緒中語句順序作了一下調整。以下程式碼僅顯示與上一篇不同的一個過程,其它程式碼不再贅述。
procedure TForm1.StartThreadsClick(Sender: TObject);var         

oChildThread : array[0..1000] of TChildThreads;

i : Integer;

begin        

For i := 0 to 1000 do

begin      

oChildThread[i] := TChildThreads.Create(true);    //注意這裡的程式碼與訊息同步中的順序。     oChildThread[i].nIndex := i;      

strcopy(@oChildThread[i].szName,PChar('Child' + IntToStr(i)));      

oChildThread[i].Resume;

end;

end;

===============================================

另一個例子:http://topic.csdn.net/t/20011015/02/323001.html

   unit    Unit1;  
   
   interface  
   
   uses  
       Windows,    Messages,    SysUtils,    Variants,    Classes,    Graphics,    Controls,    Forms,  
       Dialogs,    StdCtrls,    ExtCtrls;  
   
   type  
       TForm1    =    class(TForm)  
           Button1:    TButton;  
           Edit1:    TEdit;  
           Image1:    TImage;  
           procedure    Button1Click(Sender:    TObject);  
       private  
           {    Private    declarations    }  
       public  
           {    Public    declarations    }  
       end;  
   
       TMyThread    =    class(TThread)  
       private  
           child    :    TComponent;  
   
       public  
           procedure    draw;  
           constructor    Create(parent    :    TComponent);  
           procedure    Execute;    override;  
   
       end;  
   
   var  
       Form1:    TForm1;  
   implementation  
   
   {$R    *.dfm}  
   
   {    TMyThread    }  
   
   constructor    TMyThread.Create(parent:    TComponent);  
   begin  
       child    :=    parent;  
       inherited    Create(false);  
   end;  
   
   procedure    TMyThread.draw;  
   begin  
       if    (child    is    TEdit)    then  
       begin  
           (child    as    TEdit).Text    :=    'OK';  
       end  
       else    if(child    is    TImage)    then  
       begin  
           (child    as    TImage).Canvas.Brush.Color    :=    clBlue;  
           (child    as    TImage).Canvas.FillRect(rect(0,0,100,100));  
       end;  
   end;  
   
   procedure    TMyThread.Execute;  
   begin  
       inherited;  
       synchronize(draw);  
       if    Terminated    then    Exit;  
   end;  
   
   procedure    TForm1.Button1Click(Sender:    TObject);  
   
   begin  
       TMythread.Create(Edit1);  
       TMythread.Create(image1);  
   end;

相關推薦

Delphi執行Synchronize運用

Delphi中多執行緒用Synchronize實現VCL資料同步顯示,Delphi中多執行緒用Synchronize實現VCL資料同步顯示轉自:http://blog.csdn.net/maxcode/archive/2006/05/12/726766.aspx 概述:   

python執行event的使用-----------------即一個靈活的方法標誌位,類似於java的等待喚醒機制(python與java不同的地方)

event是python中一個特有的標誌位方法,他一共有三種方法 1.event.wait():如果標誌位設定了,它不做任何事,如果沒有設定,則將會鎖住,等待標誌位的設定 2.event.set():設定標誌位 3.event.clear():清除標誌位 這一種機制很

c++11執行Join函式

寫在前面 Join函式作用: Join thread The function returns when the thread execution has completed.//直到執行緒完成函式才返回 This synchronizes the moment t

C#執行變數研究

今天在知乎上看到一個問題【為什麼在同一程序中建立不同執行緒,但執行緒各自的變數無法線上程間互相訪問?】。在多執行緒中,每個執行緒都是獨立執行的,不同的執行緒有可能是同一段程式碼,但不會是同一作用域,所以不會共享。而共享記憶體,並沒有作用域之分,同一程序內,不管什麼執行緒都可以通過同一虛擬記憶體地址來訪問,不同

執行Join的運用(困惑的經典問題終於解決)

最近看了一個老哥的博文,發現Thread.join()的例子中每次執行結果都不一樣,特把例子貼出來: /** *  Copyright (C), 2002-2012, www.chinarainbow.com.cn *  @{#} JoinThread.java Create

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

Java執行Synchronized簡介和Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

執行的佇列不一定需要執行安全

兩個執行緒,主執行緒中update update(){   while(queue.count >0){     //process....     queue.pop()   } }   子執行緒中: queue.enqueue(data)   這樣做是沒有問

觀察者模式執行執行訂閱事件並順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

junit測試和main方法執行遇到的問題

利用Junit測試多執行緒時經常遇到任務執行不完就會停止,下面是我的任務執行緒類: package timerTest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.i

Spring4.x執行使用

直接上程式碼: 一:配置類 import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springfram

如何在執行執行注入bean

轉:https://segmentfault.com/q/1010000007172414?_ea=1264473 如何在多執行緒中注入bean?!​​​​​​​ 問題對人有幫助,內容完整,我也想知道答案0問題沒有實際價值,缺少關鍵內容,沒有改進餘地 前幾天,在sf這裡也提過這個問題,但

謹慎使用執行的fork

前言 在單核時代,大家所編寫的程式都是單程序/單執行緒程式。隨著計算機硬體技術的發展,進入了多核時代後,為了降低響應時間,重複充分利用多核cpu的資源,使用多程序程式設計的手段逐漸被人們接受和掌握。然而因為建立一個程序代價比較大,多執行緒程式設計的手段也就逐漸被人們認可和喜愛了。 記得在我剛

執行的鎖

樂觀鎖和悲觀鎖 樂觀鎖和悲觀鎖是在資料庫中引入的名詞,但是在併發包鎖裡面也引入了類似的思想,所以這裡還是有必要講解一下。 悲觀鎖指對資料被外界修改持保守的態度,認為資料很容易就會被其他執行緒修改,所以在資料被處理前就先對資料加鎖,並在整個資料處理過程中,使資料處於鎖定狀態,悲觀鎖的實現往往依靠資料庫

java執行一定快嗎?看完就知道!!!

理解上下文切換   即使是單核處理器也支援多執行緒執行程式碼,CPU通過每個執行緒分配CPU時間片來實現這個機制.時間片是CPU分配給多個執行緒的時間,因為時間片非常短,所以CPU通過不停的切換執行緒執行,讓我們感覺多個執行緒是同時執行的,時間片一般是幾十毫秒(ms).  

QT執行,物件訊號與槽連線不上的解決辦法

1、在接收者建立執行緒中,把接收者移動到主執行緒中: pReceiverObj->moveToThread(QApplication::instance()->thread()); 2、這樣傳送訊號的時候,就會在主執行緒事件佇列處理中來處理了。 把connect的最

Python執行總結

Python中的多執行緒 多執行緒 一個程序中有多個執行緒就是多執行緒。 一個程序中至少有一個執行緒,並作為程式的入口,這個就是主執行緒。一個程序至少有一個主程序,其他執行緒稱為工作執行緒。 執行緒安全:執行緒執行一段程式碼,不會產生不確定的結果,那這段程式碼就是執行緒安全。(例如pr

執行的訊號機制--sigwait 函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java執行的異常處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java執行顯式鎖的輪詢檢測策略

顯式鎖簡介 java5.0之前,在協調對共享物件的訪問時可以使用的機制只有synchronized和volatile,java5.0增加了一種新的機制:ReentrantLock。 鎖像synchronized同步塊一樣,是一種執行緒同步機制,與synchronized不同的是ReentrantLock提