【发布时间】:2017-02-28 06:48:22
【问题描述】:
根据我对 Nick Hodges 的理解,这段代码应该没问题:
TTask.Run(
procedure
var
resp, tmp: string;
req: boolean;
bwriter: TBinaryWriter;
myfile: TFileStream;
begin
//tell the user to wait
TThread.Queue(TThread.CurrentThread,
procedure
begin
LoginButton.Text := 'Please wait...';
end
);
//some checks
try
resp := GetURL('... here I get a result from the server...');
if (resp = fOKstatus) then
begin
req := true;
myfile := TFileStream.Create(TPath.Combine(TPath.GetHomePath, 'docs.mkb'), fmCreate);
try
bwriter := TBinaryWriter.Create(myfile, TEncoding.Unicode, false);
try
bwriter.Write(UsernameEdit.Text);
bwriter.Write(AppIDEdit.Text);
bwriter.Close;
finally
bwriter.Free;
end;
finally
myfile.Free;
end;
end
else
begin
req := false;
end;
except
req := false;
end;
//final
TThread.Queue(TThread.CurrentThread,
procedure
begin
if (req = true) then
begin
LoginButton.Text := 'Success!';
ShowMessage('Close the app to complete the registration.');
end
else
begin
LoginButton.Text := 'Login failed.';
end;
end
);
end
);
这在一个单独的线程中运行,并通过对Queue() 的调用链接到主线程。事实上,一开始我正在使用这种方法更新按钮的Text。
问题。看看这两行:
bwriter.Write(UsernameEdit.Text);
bwriter.Write(AppIDEdit.Text);
我需要从主线程 UI 中的两个编辑控件中检索用户名和 AppID(这是一个随机代码)。这是正确的吗?
我想我应该打电话给Queue(),但目前程序运行良好。
我可以安全地以这种方式获取值吗?我没有更新任何东西,我只需要获取数据,但我不确定混合来自 2 个不同任务的内容是否是危险的/不好的做法。
【问题讨论】:
标签: multithreading delphi