有個工控的仿真軟體有30多個單元,每個單元有20~300頁不等,每頁有幾十至幾百個運算模塊,每頁可設定一個回圈運行時間(100~500毫秒),我現在想仿做這個軟體,但不知每頁這個回圈時間是怎么設定的,如果每頁設一個時鐘,那不是有幾千個時鐘?還要是多執行緒的。那位幫我想想用什么方法實作?以下是我暫時想到的測驗代碼,但運行起來很慢,顯示都會卡
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread = class(TThread)
private
iMaxNum:Integer;
FTimer:TTimer;
protected
procedure Execute; override;
procedure TimerProc(Sender: TObject);
end;
var
Form1: TForm1;
editm:array[0..40] of tedit;i,iX,iy:Integer;
MyThread:array[0..40] of TMyThread;
implementation
{$R *.dfm}
procedure TMyThread.Execute;
var
i: Integer;Msg: TMsg;
begin
FreeOnTerminate := True; {這可以讓執行緒執行完畢后隨即釋放}
FTimer:=TTimer.Create(nil);
try
FTimer.Enabled:=True;
FTimer.Interval:=1000 ;
FTimer.OnTimer:=TimerProc;
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end;
Terminate;
finally
FTimer.Free;
end;
end;
procedure TMyThread.TimerProc(Sender: TObject);
var i:Integer;
begin
for i := 0 to 1000 do
begin
editm[iMaxNum].Text :=IntToStr(i);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Resume;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ix:=0;iy:=0;
for i:=0 to 40 do
begin
if iX>10 then
ix:=0;
editm[i]:=tedit.Create(self);
editm[i].Parent:=form1;
editm[i].Width:=120;
editm[i].Height:=20;
editm[i].Left:=ix*120;
editm[i].Top:=trunc(iy/5)*25;
editm[i].Name:= 'edit'+inttostr(i);
editm[i].Text:= 'edit'+inttostr(i);
editm[i].Visible:=true;
Inc(iX);
Inc(iy);
MyThread[i] := TMyThread.Create(True);
MyThread[i].iMaxNum:=i;
end;
end;
//掛起執行緒
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Suspend;
end;
end;
//結束執行緒
procedure TForm1.Button3Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Terminate;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Button2.Click;
Button3.Click;
end;
end.
uj5u.com熱心網友回復:
不輸出到edit上顯示cpu占用都看不到上升,只要不全部顯示就不慢了uj5u.com熱心網友回復:
TTimer控制元件,本身就是一個時間步進的獨立執行緒。執行緒中不宜多使用TTimer控制元件,否則很慢的。如果在執行緒中記時的話,通過讀取系統時間處理比較好。uj5u.com熱心網友回復:
先把回圈訊息那段去掉,成死回圈了。重繪界面要在主執行緒中,所以操作edit寫在一個程序中,用Synchronize方法呼叫。程式創建了41個執行緒,執行緒里創建計時器,執行緒完成時計時器立即釋放,執行緒也銷毀。計時器也不能持續發揮作用,沒有必要這么用。整個程式最多的是重繪界面,這在主執行緒完成。也沒有大量計算,看不出用多執行緒的必要性。uj5u.com熱心網友回復:
最近研究了愛因斯坦相對論,速度越快,時間會膨脹,時間也會變慢。多執行緒比單行程速度更快,所以這個是正常的
uj5u.com熱心網友回復:
Timer控制元件使用的是訊息處理的,你在執行緒中運行時鐘是沒意義的!全部用執行緒,然后用執行緒來模擬時鐘就好,處理資料的放到后臺,處理完了之后發送一個事件信號,然后前臺重繪UI就好,合理運用Event來處理就可uj5u.com熱心網友回復:
你要么用BMDThread控制元件做多執行緒吧,非常的簡單好用uj5u.com熱心網友回復:
用分頁方法來實作吧。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58230.html
標籤:語言基礎/算法/系統設計
上一篇:請問如何能回傳正確路徑???
下一篇:AbUnzip解壓報錯
