线程在EXE中可以正常运行,在COM+怎么运行不了呢

megin 2008-12-29 02:42:01
我在COM+中用了INDY控件TIdTCPClient,一是用来给TIdTCPServer发送消息,二是用来接收TIdTCPServer响应的消息,
接收响应消息是写在一个线程里面的;这个线程可以EXE程序运行,但是在COM+中没有运行,有人知道其中的原有吗?谢谢


unit COMTCPUnit;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComServ, ComObj, VCLCom, StdVcl, bdemts, DataBkr, DBClient,
MtsRdm, Mtx, PCOMTCP_TLB, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, DB, ADODB;

type

TCommBlock = record // the Communication Block used in both parts (Server+Client)
Command,
MyUserName, // the sender of the message
Msg, // the message itself
ReceiverName: string[100]; // name of receiver
end;

type
TClientHandleThread = class(TThread)
private
CB: TCommBlock;
procedure HandleInput;

protected
procedure Execute; override;

end;

type
TCOMTCP = class(TMtsDataModule, ICOMTCP)
Client: TIdTCPClient;
qrySave: TADOQuery;
ADOConnection1: TADOConnection;
qrySavevValue: TWideStringField;
procedure ClientConnected(Sender: TObject);
private


{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
procedure SetTCPActive; safecall;
procedure SetTCPNotActive; safecall;
procedure SendData; safecall;
function GetStr: WideString; safecall;
public
Returnstr: string[100];
isOK: boolean;
CB1: TCommBlock;

{ Public declarations }
end;

var
COMTCP: TCOMTCP;
ClientHandleThread: TClientHandleThread; // variable (type see above)


implementation

{$R *.DFM}

class procedure TCOMTCP.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;

{ TClientHandleThread }

procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not COMTCP.Client.Connected then //第一次运行到这里就结束了,以后就不执行了
Terminate
else
try
COMTCP.Returnstr := COMTCP.Client.ReadLn();
if COMTCP.Returnstr<>'' then
begin
with COMTCP do
begin
if qrySave.Active=false then qrySave.Active := true;
qrySave.Append;
qrySave.Fields[0].AsString := Returnstr;
qrySave.Post;
end;
end;
// COMTCP.Client.ReadBuffer(CB, SizeOf (CB));
// ClientFrmMain.strP := ClientFrmMain.Client.ReadLn();
// Synchronize(HandleInput);
except
end;
end;
end;

procedure TClientHandleThread.HandleInput;
begin
//
end;

procedure TCOMTCP.SetTCPActive;
begin

end;

procedure TCOMTCP.SetTCPNotActive;
begin

try
ClientHandleThread.Terminate;
Client.Disconnect;
except

end;

end;

procedure TCOMTCP.SendData;
var
strs: string;
CommBlock,CommBlock1 : TCommBlock;
begin
if not Client.Connected then
BEGIN
Client.Connect();
{
ClientHandleThread := TClientHandleThread.Create(True);
ClientHandleThread.FreeOnTerminate:=True;
ClientHandleThread.Resume;
}
END;
Client.WriteLn(datetimetostr(now));
strs := Client.ReadLn();
// Returnstr := strs;
{
CommBlock.Command := '11111111111111111'; // assign the data
CommBlock.MyUserName := '22222222222222222';
CommBlock.Msg := '33333333333333333';
CommBlock.ReceiverName := '44444444444444444';

Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
}
{
Client.ReadBuffer(CommBlock1, SizeOf (CommBlock1));

Returnstr := CommBlock1.Command+ CommBlock1.MyUserName+ CommBlock1.Msg+ CommBlock1.ReceiverName;
}
end;

function TCOMTCP.GetStr: WideString;
begin
result := '';
result := Returnstr;
end;

procedure TCOMTCP.ClientConnected(Sender: TObject);
begin

IF Client.Connected then
begin

ClientHandleThread := TClientHandleThread.Create(True);
ClientHandleThread.FreeOnTerminate:=True;
ClientHandleThread.Resume;

end;

end;

initialization
TComponentFactory.Create(ComServer, TCOMTCP,
Class_COMTCP, ciMultiInstance, tmApartment);
end.
...全文
56 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
megin 2008-12-30
  • 打赏
  • 举报
回复
回楼上,调试跟踪发现发现如下:
procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not COMTCP.Client.Connected then //第一次运行到这里就结束了,以后就不执行了
Terminate
else
try
COMTCP.Returnstr := COMTCP.Client.ReadLn();
if COMTCP.Returnstr <>'' then
begin
with COMTCP do
begin
if qrySave.Active=false then qrySave.Active := true;
qrySave.Append;
qrySave.Fields[0].AsString := Returnstr;
qrySave.Post;
end;
end;
// COMTCP.Client.ReadBuffer(CB, SizeOf (CB));
// ClientFrmMain.strP := ClientFrmMain.Client.ReadLn();
// Synchronize(HandleInput);
except
end;
end;
end;
不知道是不是控件的原因,在EXE中运行没问题
僵哥 2008-12-29
  • 打赏
  • 举报
回复
COM有实例存在吗?
megin 2008-12-29
  • 打赏
  • 举报
回复
写漏字了:这个线程可以在EXE程序运行,在COM+中运行不。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧