Delphi中的多线程安全事件

时间:2019-01-28 20:28:54

标签: multithreading delphi

我是Delphi编程的初学者。 我使用一个线程与我的服务器进行通信,我想在创建时将Tevent传递给我的线程,并使用它在主线程上向该线程发出任务信号,最后在线程上清除该事件。此事件在主线程中设置,以向我的网络线程中的任务发出信号,并在网络线程中的任务完成后最终清除。 我使用此行在运行时创建线程。一切正常,但是在向我的代码添加事件后出现了问题。

Net_thread:= TNetThread.Create(user, password, TheCallback, Tevent);

TNetThread是我在其他单元上的线程类,而Net_thread是我的净线程。 TheCallback是从线程更改UI的过程。在TNetThread中声明此类型。 用户,密码是在GUI中收集的登录数据。 Tevent是我在主线程中创建的事件的句柄,并将其传递给Net_thread

在将事件添加到代码中之前,我只传递了2个字符串和一个线程过程,并且没有问题。 ...Create(user, password, TheCallback);在将事件添加到我的代码并将其作为THandle传递给我的线程后无法使用。它就像一个基数变量,当我尝试使用以下代码检查其状态时:

System.SyncObjs.TEvent.WaitFor(FEvent)

我遇到错误e2076。 FEvent在构造函数TNetThread.Create上设置,等于从主线程接收到的Tevent。

请给我一个简单的例子?

这是我的最小代码: 主要形式:

procedure TMainform.FormCreate(Sender: TObject);
var
  T_event: THandle;
begin
    T_event: := CreateEvent(nil, True, False, nil);
    Net_thread:= TNetThread.Create(user, password, TheCallback, T_event);
end;

procedure TMainform.TheCallback(const st,h : String);
begin
    //recive data from net thread
end;

在主线程中发生事件         SetEvent(T_event);

以及其他单位

type
  TMyCallback = procedure(const st, h : String) of object;

  TNetThread = class(TThread)
    IdTCPClient1: TIdTCPClient;
  private
    FCallback : TMyCallback;
    FEvent: THandle;
  protected
    procedure execute; override;
    procedure SendLog(st, h: string);
  public
    constructor Create(user_n, psw: string ;aCallback : TMyCallback ; const AEvent: THandle);
  end;

constructor TNetThread.Create(user_n, psw: string ;aCallback: TMyCallback; const AEvent: THandle);
begin
  inherited Create(false);
  FCallback := aCallback;
  FEvent := AEvent;
  user_name := user_n;
  password:= psw;
  FreeOnTerminate := true;
end;

procedure TNetThread.SendLog(st ,h: string);
begin
  if not Assigned(FCallback) then
    Exit;
  Self.Queue(  // Executed later in the main thread
    procedure
    begin
      FCallback(st, h);
    end
  );
end;

procedure TNetThread.Execute;
begin
.
.
    if (System.SyncObjs.TEvent.WaitFor(FEvent) = wrSignaled) then...
.
.
end;

0 个答案:

没有答案
相关问题