我有一个TThread实例,我希望等待用户输入。线程加载一些东西,等待用户单击一个按钮,然后继续它的任务。
我正在考虑将全局bool设置为true,但是对于我认为的实例来说,这不太好,线程必须在循环中检查var状态,这似乎有点不专业。
是否有一种安全的方法可供线程类等待用户输入?
发布于 2014-01-08 11:36:17
您可以使用来自TEvent单元的SyncObjs。
TMyThread = class(TThread)
public
SignalEvent : TEvent;
procedure Execute; override;
end;
TMyForm = class(TForm)
procedure Button1Click(Sender : TObject);
public
myThread : TMyThread;
end;线程完成其工作,然后等待事件通过单击事件按钮发出信号。通过使用TEvent,您还可以指定超时。(或0无限期地等待)。
procedure TMyForm.Button1Click(Sender : TObject);
begin
// Tell the thread that the button was clicked.
myThread.SignalEvent.SetEvent;
end;
procedure TMyThread.Execute;
var
waitResult : TWaitResult;
begin
// do stuff
// Wait for the event to signal that the button was clicked.
waitResult := SignalEvent.WaitFor(aTimeout);
if waitResult = wrSignaled then
begin
// Reset the event so we can use it again
SignalEvent.ResetEvent;
// do some more stuff
end else
// Handle timeout or error.
end;发布于 2014-01-08 11:27:35
我很久以前就使用了Delphi,所以不幸的是我不能提供非常具体的解决方案,但是我可以为您指明正确的方向。您基本上需要信令事件(德尔菲术语中的TEvent)。您可以在这里找到更多的信息和示例:Completed
所以从本质上说,事件是一个可以等待并发出信号的对象。因此,等待输入的信号应该等待事件,而在按下按钮的方法上,就可以发出信号,线程就会解冻。
https://stackoverflow.com/questions/20994046
复制相似问题