小弟用一ocx的socket控件(非阻塞)接受信息,但由于接受的数量比较大(大约一天40000左右的数据)所以想在子线程中动态生成该ocx控件,该socket在接受到信息时会消息触发一个OnDatagramReady的事件,我在线程中写了一个过程指向该事件已在线程中响应该消息,但我不知道线程的execute中应该怎么写,是应该让execute中跑一个死循环么?可是这样会很浪费资源...如果在execute中写入类似APPLICATION.ProcessMessages或SLEEP(1000)的代码会不会在某些时候不能使控件接受消息触发...我应该怎样才能做到使程序既有效率又能使控件在线程中无障碍的响应消息呢?请高手指点...叩谢!!
大致线程的代码如下:
unit MsgThread;interfaceuses
Classes, SOCKOCXLib_TLB, WinSock, Graphics, QForms, SysUtils;type
TRecMsgth = class(TThread)
private
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean; Home: string; SerIp: string; Flag: integer);overload;
procedure RecDataPro(ASender: TObject; const buffer: WideString; error: Smallint);//控件接受信息时触发的事件
end;var
socketocx: TSockOcx;implementationuses changemsg;{ TRecMsgth }constructor TRecMsgth.Create(CreateSuspended: Boolean; Home: string; SerIp: string; Flag: integer);
begin
inherited Create(CreateSuspended);
Socketocx:= TSockOcx.Create(Form1);
//初始化socketocx控件,并进行连接
if Socketocx.InitSocket(Home,SerIp,Flag) then
begin
//连接后的初始化处理
end
else
begin
//若与服务器连接不成功时的处理
end;
//对接收数据事件的响应
Socketocx.OnDatagramReady:= RecDataPro; self.Resume;
end;procedure TRecMsgth.RecDataPro(ASender: TObject; const buffer: WideString; error: Smallint);
//对从服务器接收到的报文的处理
begin
//当线程中动态生成的控件接收到自服务器发来的信息时触发此过程进行处理
//怎么才能保证这里的信息一定能够被接受到???
end;procedure TRecMsgth.Execute;
begin
//是应该这么些么??如下执行后处理器运行达到100%,而且我怀疑好像也不能接受到
//控件中的信息
while not Terminated do
BEGIN
APPLICATION.ProcessMessages;
// SLEEP(1000);
END;
end;end.
请各位大哥指点!!
大致线程的代码如下:
unit MsgThread;interfaceuses
Classes, SOCKOCXLib_TLB, WinSock, Graphics, QForms, SysUtils;type
TRecMsgth = class(TThread)
private
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean; Home: string; SerIp: string; Flag: integer);overload;
procedure RecDataPro(ASender: TObject; const buffer: WideString; error: Smallint);//控件接受信息时触发的事件
end;var
socketocx: TSockOcx;implementationuses changemsg;{ TRecMsgth }constructor TRecMsgth.Create(CreateSuspended: Boolean; Home: string; SerIp: string; Flag: integer);
begin
inherited Create(CreateSuspended);
Socketocx:= TSockOcx.Create(Form1);
//初始化socketocx控件,并进行连接
if Socketocx.InitSocket(Home,SerIp,Flag) then
begin
//连接后的初始化处理
end
else
begin
//若与服务器连接不成功时的处理
end;
//对接收数据事件的响应
Socketocx.OnDatagramReady:= RecDataPro; self.Resume;
end;procedure TRecMsgth.RecDataPro(ASender: TObject; const buffer: WideString; error: Smallint);
//对从服务器接收到的报文的处理
begin
//当线程中动态生成的控件接收到自服务器发来的信息时触发此过程进行处理
//怎么才能保证这里的信息一定能够被接受到???
end;procedure TRecMsgth.Execute;
begin
//是应该这么些么??如下执行后处理器运行达到100%,而且我怀疑好像也不能接受到
//控件中的信息
while not Terminated do
BEGIN
APPLICATION.ProcessMessages;
// SLEEP(1000);
END;
end;end.
请各位大哥指点!!
你可以調整線程的優先級, 或用 sleep都可!! 不會浪費資源的!
还有怎么才能调整线程的优先级呢?又依据什么设置呢?哪位大哥能帮着举个例子...小弟不胜感激!!!!
非阻塞的SOCKET,就直接在主线程用.
你这样很容易引发一系列其它问题.另外,sleep只需50以下就行了..
不能接收消息原因跟SLEEP无关.APPLICATION.ProcessMessages;处理的只能是主线程消息.
而是可以考虑在OnRead之类事件处理中,使用多线程或者队列技术,
使OnRead在主线程处理的时间缩短.