mainform中放了一个tcpclient控件用来接受server发送过来的命令。
在工作线程中使用 mainform.tcpclient.readln 这样的命令来接收,但是会时不常的发生接受不到的情况(server端确实已经发送了),请问这种情况和线呈访问主应用的indy控件有关吗?该怎么解决?
线程中刷新mainform界面的代码我都是sendmessage让主应用画的。
在工作线程中使用 mainform.tcpclient.readln 这样的命令来接收,但是会时不常的发生接受不到的情况(server端确实已经发送了),请问这种情况和线呈访问主应用的indy控件有关吗?该怎么解决?
线程中刷新mainform界面的代码我都是sendmessage让主应用画的。
解决方案 »
- 注册表启动项的问题
- 兴奋帖:精通C++的5条绝密配方,如果你做到了,Bill Gates开着加长车,像当年请Anders Hejlsberg一样来请你
- 三层结构客户数据更新的问题?
- 请问结构化存储(OLE Structured Storage)是不是在同一时间只能够有一个线程或程序访问?
- 有什么办法可以把,自已的程序和 kernel32.dll 绑在一起,不让自已的程序关掉?
- 关于统计的<<难题>>高手请进,我给100分!各位帮忙了!
- 求:点到直接距离,三个坐标A(X,Y),B(X',Y'),C(X'',Y'')求A到BC直接距离
- 新手提问~~大家帮帮忙!!
- 对象为什么不能create?
- 改变无边框窗体的大小
- 8位有符号整数
- 高手们指点一下!关于cxgrid的oneditvaluechanged的问题?为什么刚更改的字段又变回到以前的内容?
procedure TWorkThread.Execute;
var
LCommand: string;
LReceived: string;
LRecCommand: string; LTcom: string;
LNodeFinished, i: Integer;begin
bError := false; FreeOnTerminate := true;
LTcom := trim(MainForm.Synsql.SelText); LCommand := LTcom;
if LCommand <> '' then
LCommand := 'C' + LCommand
else
LCommand := 'C' + trim(MainForm.Synsql.Text); LCommand := StringReplace(LCommand, '#13#10', '', [rfReplaceAll]);
LReceived := '';
LRecCommand := '';
if (LCommand <> '') then
begin
with MainForm.IdTCPClient do
begin
try
WriteLn(LCommand); while LReceived = '' do
begin
LReceived := ReadLn;
LReceived := trim(LReceived);
LRecCommand := midstr(LReceived, 0, 3); strInfo := 'Server said : ' + LReceived;
SendMessage(MainForm.Handle, WM_FillInfo, 1, 0); if LReceived <> 'END' then
begin
LRecCommand := midstr(LReceived, 0, 1);
if LRecCommand = 'T'
......
else if LRecCommand = 'N' then
......
else if LRecCommand = 'C' then
...... else if LRecCommand = 'E' then //出错信息
......
end else
...... end; except
on E: Exception do
begin
ShowMessage(E.Message);
end;
end;
end
end;
end;
procedure TRecThread.Execute;
var
ires,i,j : integer;
recMsg : TMyMsg;
stmp,tmpName,tmpRealName,tmpDept,pointDept : String;
sNode,ss : TTreeNode;
begin
{ Place thread code here }
FreeOnTerminate := True; while ((not Terminated) and DM.tcpLog.Connected) do
begin
ires := DM.tcpLog.ReadFromStack;
不知道是不是需要将 readln 单独Synchronize一下?