如何將創建帶引數的多執行緒,麻煩能將TForm1.threadtest改變成一個帶引數的多執行緒,利用tthread類
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure threadtest(strtest:string);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.threadtest(strtest:string);
begin
showmessage(strtest);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
threadtest('str');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ProgressBar1.Max do
begin
Label1.Caption := '主執行緒運行中';
ProgressBar1.Position := i;
Application.ProcessMessages;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
progressbar1.Max := 1000000;
end;
end.
uj5u.com熱心網友回復:

跪求大神幫忙,這個問題十分糾結。。。。。。。。。。。。。。。。。。。。。。。
uj5u.com熱心網友回復:
初學delphi,實在不懂如何修改。。。uj5u.com熱心網友回復:
upupupupupuj5u.com熱心網友回復:
這是一個值得思考的問題。。。。uj5u.com熱心網友回復:
似乎并不怎么懂啊uj5u.com熱心網友回復:
第一個辦法是在加入到執行緒類解構式中,有局限性,適合創建執行緒不掛起執行緒馬上獲取你傳遞的引數才能正常運行的情況,第二種是在執行緒類的publish域添加property 。使用時,創建執行緒物件后,將引數傳入到property中去。提示:不要使執行緒去掛起來同步執行緒,應該使用同步技術去同步執行緒。uj5u.com熱心網友回復:
具體該怎么操作呢,剛學delphi,并不知道該怎么處理?
uj5u.com熱心網友回復:
TMyThread=class(TThread)FParam : string;
constructor Create(AParam: string);
end;
constructor TMyThread.Create(AParam: string);
begin
FParam:=AParam;
inherited Create(True);
end;
uj5u.com熱心網友回復:
TThread類。。。害了多少人,用CreateThread做,簡單實用,原版API,不加任何添加防腐劑。相關API:
CreateThread
TerminateThread
WaitForSingleObject
InitializeCriticalSection
DeleteCriticalSection
EnterCriticalSection
LeaveCriticalSection
uj5u.com熱心網友回復:
你的問題,提醒一下:一、不要使用API的執行緒,直接使用Delphi年代的執行緒類Tthread非常方便。它已經封閉必要的方法。
二、在執行緒中,不要使用For回圈,它不便中止。建議使用Repeat回圈,設定一全域變數ThreadEnd,專用中途中止執行緒。
三、在procedure TThread1.Execute中,是執行緒中執行的代碼,只要代碼執行完畢,執行緒自動終止,釋放占用記憶體。
下面是對你的代碼進行修改的原始碼,僅供參考:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TThread1 = class(Tthread)
protected
procedure Execute;override;
end;
type
TForm1 = class(TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ThreadEnd:boolean;
implementation
{$R *.dfm}
procedure TThread1.Execute; // 執行緒執行
var
I: Integer;
begin
i:=0;
ThreadEnd:=False;
FreeOnTerminate:=true;
Repeat
i:=i+1;
Form1.ProgressBar1.Position := i;
Application.ProcessMessages;
until (I>=Form1.ProgressBar1.Max) or ThreadEnd;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
progressbar1.Max := 100000;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyThread:TThread1;
begin
MyThread:=TThread1.Create(False); // 創建執行緒并執行執行緒
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ThreadEnd:=True; // 中止執行緒
end;
end.
uj5u.com熱心網友回復:
建議用第二種
執行緒類里宣告個屬性(引數),如果引數在執行緒運行中是不變的,剛創建執行緒的時候就設定屬性值。如果引數在執行緒運行中要改變,則要改變引數時,暫停執行緒,然后設定屬性值,再啟動執行緒。
暫停可以用執行緒的waitfor函式
uj5u.com熱心網友回復:
procedure TThread1.Execute; // 執行緒執行var
I: Integer;
begin
i:=0;
ThreadEnd:=False;
FreeOnTerminate:=true;
Repeat
i:=i+1;
Form1.ProgressBar1.Position := i;
Application.ProcessMessages;
until (I>=Form1.ProgressBar1.Max) or ThreadEnd;
end;
@lyhoo163
如果非要用執行緒類,在控制視窗控制元件時,需要用執行緒類的同步方法:Synchronize。
uj5u.com熱心網友回復:
PostThreadMessageuj5u.com熱心網友回復:
或者用信號量SetEvent
執行緒回圈中用 WaitforMultiEvent...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/76071.html
標籤:語言基礎/算法/系統設計
上一篇:夢套夢.醒不來的夢
