我是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;