當前位置:首頁 » 編程軟體 » delphi多線程編程

delphi多線程編程

發布時間: 2022-08-12 17:27:35

Ⅰ delphi 多線程編程問題

多線程中使用方法注意以下幾點就可以了!
1.在更新VCL控制項的時候使用Synchronize.
2.如果線程內定義了全局變數,如果想修改它的話,一般常用臨界,如果是多進程方式同步的話使用互斥等....
3.你所說的使用synchonrize和不使用synchronize結果一樣,沒有什麼區別.!這是在單個線程中沒有發現問題,如果多個線程同時運行此段代碼就會出現內存寫入和讀取錯誤了!

Ⅱ Delphi 如何用多線程進行數據採集

就以下兩個方面來講解以下在delphi中如何用多線程進行數據採集:
---- 1. 多線程進行數據採集應解決的問題
---- 其實,多線程程序設計復雜是暫時的;如果,你採用傳統的C進行多線程的設計,那麼你必須自己控制線程間的同步。那將是很復雜的。但是,如果利用面向對象的設計方法,採用Delphi進行多線程程序設計,問題就簡單多了。這是因為,Delphi已將多線程的復雜性替我們處理了,我們所要做的就是繼承。
---- 具體地說,多線程數據採集需要完成以下工作:
---- ① 從TThread類派生一個自己的類SampleThread。這就是我們用於數據採集的類。進行採集時,只需要簡單地創建一個SampleThread的實例。
---- ② 重載超類TThread的Execute方法。在這一方法中將具體地執行數據採集任務。
---- ③ 如果希望一邊採集一邊顯示,就在編寫幾個用於顯示採集進度的過程,供Execute方法調用。
---- TThread類中最常用的屬性/方法如下:
Create方法:constructor Create
(CreateSuspended: Boolean);
---- 其中CreateSuspended參數確定線程在創建時是否立即執行。如果為True,新線程在創建後被掛起;如果為False,線程在創建後立即執行。
FreeOnTerminate屬性:
property FreeOnTerminate: Boolean;
---- 該屬性確定程序員是否負責撤消該線程。如果該屬性為True,VCL將在該線程終止時自動撤消線程對象。它的預設值為False。
OnTerminate屬性:
property OnTerminate: TNotifyEvent;
---- 該屬性指定一個當線程終止時發生的事件。
---- 下面看一個具體的例子:
---- 2. 多線程數據採集的實現
---- 這是筆者開發的一個測抽油機功圖的程序。它的功能是採集抽油機懸點的載荷及位移數據,經過處理後做出抽油機的功圖。圖1(略)所示是數據採集時的界面。點「採集數據」按鈕後,程序將創建一新的線程,並設置其屬性。這一新線程將完成數據採集任務。程序如下:
Procere TsampleForm.
DoSampleBtnClick(Sender: TObject);
Begin
ReDrawBtn.Enabled := True;
DoSampleBtn.Enabled := False;
FFTBtn.Enabled := True;
TheSampler := SampleThread.Create(False);
創建採集線程
TheSampler.OnTerminate := FFTBtnClick;
採集完成後要執行的任務
TheSampler.FreeOnTerminate := True;
採集完成後撤消
End;
---- 採集線程的類定義如下:
Type
SampleThread = class(TThread)
Public
function AdRead(ach: byte): integer; safecall;
讀A/D卡的函數
procere UpdateCaption;
顯示採集所用時間
private
{ Private declarations }
protected
thes, thep: real;
dt: real;
id: integer;
st, ed: LongInt;
procere Execute; override;
這是關鍵。
End;
---- 在這個類中定義了一個函數AdRead用於操作A/D卡,兩個過程用於顯示採集的進度與所用時間。需要注意的是AdRead函數是用匯編寫的,參數調用格式必須是safecall。
---- 關鍵的重載方法Execute的代碼如下:
Procere SampleThread.Execute;
Begin
StartTicker := GetTickCount;
id := 0;
Repeat
thes := Adread(15) * ad2mv * mv2l;
採集第15通道
thep := Adread(3) * ad2mv * mv2n;
採集第3通道
dt := GetTickCount - StartTicker;
sarray[id] := thes;
parray[id] := thep;
tarray[id] := dt;
inc(id);
Synchronize(UpdateCaption);
注意:顯示採集進度
Until id >=4096;
ed := GetTickCount;
Synchronize(ShowCostTime);
注意:顯示所用時間
end;
---- 從以上代碼中可見,Execute與一般的代碼並無本質區別。僅有的區別是顯示採集進度和顯示所用時間時,不能直接調用各自的過程,而是通過調用Synchronize間接地調用。這樣作是為了保持進程間的同步。

Ⅲ Delphi多線程怎麼處理

給你一個簡單的參考代碼:
delphi線程的創建、掛起、激活與終止
procere
tform1.button1click(sender:
tobject);
begin
//創建線程,同時線程函數被調用
hthread:=createthread(nil,0,@mythreadfunc,nil,0,threadid);
end;
procere
tform1.button2click(sender:
tobject);
begin
suspendthread(hthread);
//掛起線程
end;
procere
tform1.button3click(sender:
tobject);
begin
resumethread(hthread);
//
激活線程
end;
procere
tform1.button4click(sender:
tobject);
begin
terminatethread(hthread,0);
//終止線程
end;

Ⅳ 怎麼樣使用Delphi多線程下的ADO編程

由於ADO控制項的線程不安全性(事實上這種不安全性是來自Micrsoft ADO Library,所以在其它開發工具中也存在同樣的問題)因此在使用多線程ADO編程時應該注意一下問題:
第一:要保證每個線程都擁有自己的會話。
第二:作為客戶端程序應該盡可能的減少與資料庫庫伺服器的連接數。
第三:在退出線程之前確保釋放所有的資源。

Ⅳ 高分求解Delphi多線程編程

定義一個全局變數 i 定義一個定時器 Timer 間隔時間設置為20秒
注意在 遞增變數的時候 一定要加鎖 防止兩個線程同時遞增這個變數

聲明一個臨界區變數 L:TRTLCriticalSection
程序創建時 初始化臨界區變數 InitializeCriticalSection(L)

遞增i時:鎖住臨界區
EnterCriticalSection(L);//進入臨界區
inc(i)
LeaveCriticalSection(L);//退出臨界區

程序結束時 刪除臨界區變數
DeleteCriticalSection(L)

timer在20秒的時候檢測i的值就可以了

臨界區變數保證在enter和leave之間的代碼同時只能有一個線程訪問
防止了變數訪問的沖突

Ⅵ 請教delphi多線程技術監控多個串口

要弄清楚Delphi串口編程的問題,這是程序的必備部分,你可以參考程序員大本營中的源碼,一定能找到這樣的例子。

2,參考變頻器手冊,找到相應的指令,按照規范向變頻器發指令,就可以控制電機和監控了。

這是你的實習課程,正好可以鍛煉你這方面的能力,建議一定要不怕困難,克服幾個難題後,你的能力會有質的提升。

你們的這個題目不錯,很有實用價值。其實我以前做過一個項目,就是做這樣的一個程序。

Ⅶ 請教編程高手-關於多線程與消息隊列(DELPHI)

DELPHI中,可以創建線程的對象。
對這個對象進行操作就可以了。

熱點內容
演算法牛 發布:2024-05-05 22:43:40 瀏覽:718
grublinux引導 發布:2024-05-05 22:37:56 瀏覽:214
unix高級編程第三版pdf 發布:2024-05-05 22:32:09 瀏覽:958
手機wap網站源碼 發布:2024-05-05 22:27:44 瀏覽:259
python修改文件某一行 發布:2024-05-05 22:18:22 瀏覽:457
md5加密64 發布:2024-05-05 21:59:30 瀏覽:527
259pp頁面訪問升級 發布:2024-05-05 21:47:51 瀏覽:89
迅雷阻止上傳 發布:2024-05-05 21:26:19 瀏覽:914
資料庫運維題 發布:2024-05-05 21:21:47 瀏覽:962
RM魔塔編程 發布:2024-05-05 21:21:47 瀏覽:286