Delphi中多執行緒中Synchronize的運用
轉自: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提