【发布时间】:2015-10-30 15:45:32
【问题描述】:
我想知道是否有可能出现这种情况:
1) 有一个带有一些变量的主线程。
2) 这个线程必须创建 2 个子线程,并且这个线程应该能够读取主线程的变量。
3) 我想创建不同的主线程(带有子线程)。
这甚至可能吗?
到目前为止我已经尝试过了,但它不起作用(检查“procedure TSubThread.Execute;”):
unit uMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TMainThread = class(TThread)
private
protected
procedure Execute; override;
public
TestVar1: integer;
end;
TSubThread = class(TMainThread)
private
protected
procedure Execute; override;
public
end;
TfMain = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
function RunThread(trTestVar1: integer): TMainThread;
procedure ThreadTerminated(Sender: TObject);
function RunSubThread: TSubThread;
procedure SubThreadTerminated(Sender: TObject);
public
{ Public declarations }
end;
var
fMain: TfMain;
implementation
{$R *.dfm}
////////////////////////////////////////////////////////////////////////////////
// MAINTHREAD
////////////////////////////////////////////////////////////////////////////////
function TfMain.RunThread(trTestVar1: integer): TMainThread;
var CalcThread : TMainThread;
begin
CalcThread := TMainThread.Create(true);
CalcThread.TestVar1 := trTestVar1;
CalcThread.FreeOnTerminate := true;
CalcThread.OnTerminate := ThreadTerminated;
CalcThread.Start;
Result := CalcThread;
// Here I start the SUB-THREAD
RunSubThread;
end;
procedure TfMain.ThreadTerminated(Sender: TObject);
begin
//
end;
procedure TMainThread.Execute;
begin
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
// SUBTHREAD
////////////////////////////////////////////////////////////////////////////////
function TfMain.RunSubThread: TSubThread;
var SubThread : TSubThread;
begin
SubThread := TSubThread.Create(true);
SubThread.FreeOnTerminate := true;
SubThread.OnTerminate := SubThreadTerminated;
SubThread.Start;
Result := SubThread;
end;
procedure TfMain.SubThreadTerminated(Sender: TObject);
begin
//
end;
procedure TSubThread.Execute;
begin
inherited;
// Here the value of TestVar1 is always 0
end;
////////////////////////////////////////////////////////////////////////////////
// MAIN THREAD
////////////////////////////////////////////////////////////////////////////////
procedure TfMain.FormCreate(Sender: TObject);
begin
// I start the first "Main Thread"
RunThread(1);
// I start the second "Main Thread"
RunThread(2);
end;
end.
【问题讨论】:
-
在线程之间共享变量是微不足道的。您只需让它们可见,就像在对象之间共享变量一样。当然,现在您必须处理数据竞争。作为一般规则,共享是您希望最小化的事情。如果可能的话,根本不共享,然后你就没有争用了。
-
您让我们注意
TSubThread.Execute,其中一条评论说TestVar1始终为0。这段代码中没有任何内容分配TestVar1,所以它唯一的值就是它的值在创建其封闭对象时获取,即 0。您希望它在TSubThread.Execute或其他地方具有什么其他值? -
我希望我在 RunThread(1) 和 RunThread(2) 中传递的值会将该变量设置为 1 和 2。这只是一个测试,它不起作用......并且我希望得到一些建议..
-
如果您不了解 Pascal 的基础知识,那么转向线程有点像刚获得初学者执照时试图参加 Indy 500 比赛。慢点,小辈。
-
沃伦,我不明白你的意思..克里斯蒂安(下)理解了这个问题并解决了它..你写在这里是为了冒犯吗?
标签: multithreading delphi delphi-xe8