首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TThread等待用户输入

TThread等待用户输入
EN

Stack Overflow用户
提问于 2014-01-08 11:15:48
回答 2查看 880关注 0票数 2

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

我正在考虑将全局bool设置为true,但是对于我认为的实例来说,这不太好,线程必须在循环中检查var状态,这似乎有点不专业。

是否有一种安全的方法可供线程类等待用户输入?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 11:36:17

您可以使用来自TEvent单元的SyncObjs。

代码语言:javascript
复制
TMyThread = class(TThread)
public
    SignalEvent : TEvent;
    procedure Execute; override;
end;


TMyForm = class(TForm)
    procedure Button1Click(Sender : TObject);
public
    myThread : TMyThread;
end;

线程完成其工作,然后等待事件通过单击事件按钮发出信号。通过使用TEvent,您还可以指定超时。(或0无限期地等待)。

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2014-01-08 11:27:35

我很久以前就使用了Delphi,所以不幸的是我不能提供非常具体的解决方案,但是我可以为您指明正确的方向。您基本上需要信令事件(德尔菲术语中的TEvent)。您可以在这里找到更多的信息和示例:Completed

所以从本质上说,事件是一个可以等待并发出信号的对象。因此,等待输入的信号应该等待事件,而在按下按钮的方法上,就可以发出信号,线程就会解冻。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20994046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档