我有一个TThread
实例,我想等待用户输入。
线程加载一些东西,等待用户单击一个按钮,然后继续它的任务。
我正在考虑将全局bool设置为true,但这对于我认为的实例来说效果不会很好,并且线程必须在循环中检查var状态并且它看起来有点不专业。
是否有一种安全的方法让tthread类等待用户输入?
答案 0 :(得分:2)
我很久以前就使用过Delphi,所以很遗憾我无法提供非常具体的解决方案,但我可以指出正确的方向。您基本上需要信令事件(Delphi的术语中为TEvent
)。您可以在此处找到更多信息和示例:http://docwiki.embarcadero.com/RADStudio/XE2/en/Waiting_for_a_Task_to_Be_Completed
所以基本上事件是你可以等待和发出信号的对象。所以等待输入的信号应该等待事件,并且按下按钮的方法你发出信号事件,线程将解冻。
答案 1 :(得分:2)
您可以使用SyncObjs单元中的TEvent。
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;