TThread等待用户输入

时间:2014-01-08 11:15:48

标签: windows multithreading delphi vcl

我有一个TThread实例,我想等待用户输入。 线程加载一些东西,等待用户单击一个按钮,然后继续它的任务。

我正在考虑将全局bool设置为true,但这对于我认为的实例来说效果不会很好,并且线程必须在循环中检查var状态并且它看起来有点不专业。

是否有一种安全的方法让tthread类等待用户输入?

2 个答案:

答案 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;