2004.03.14 (日) 06:59:24 <u*j*2*6*> いろいろ試行錯誤してみたのですが、結局TServer.Compileの中からすぐにTServer.Flushを呼ぶことにしました
2004.03.14 (日) 07:00:42 <u*j*2*6*> どうもCompileとFlushは呼ばれすぎのようなので(1秒で平均80回ぐらい)、もうちょっと効率よくしたい気がします
2004.03.14 (日) 07:09:53 <u*j*2*6*> デバッグポイントをおくと現象が再現しなかったり、ステップ実行の挙動があやしかったり、かなりやっかいなバグでした
2004.03.14 (日) 15:53:58 <u*j*2*6*> あとで別の解決法にかえるかも

リモートサーバーへのデータの送信

リモートユーザーへのコマンドはTServer.Exec手続きでTServer.out_listにいったん格納される。
out_listにコマンドがある程度たまったらTServer.Compile手続きで圧縮され、
procedure TServer.AddToOutput手続きでTServer.out_bufに格納される。
一方でTServer.Flush手続きがあちこちでよばれ、TServer.out_bufのデータをリモートサーバーに送る。

---------------------------------------------------------------------------------------------
リモート参照の完了がおそいことの解決までの記録

TServer.Compileのif i>0 then AddToOutput(cmd.cmd)と
TServer.AddToOutputのout_buf.AddCmd(GetTickCount,str)に
ブレークポイントをおいてリモート参照してみた。

結果、
out_bufに参照応答の残りを格納するところまでは遅延がないことがわかった。
out_bufにはデータがきちんと入っている(out_buf.count=4)。
また、参照応答が完了していない状態でてきとうな場所でブレークさせ、
out_buf.countをみると0になっている。つまりout_buf.Delete(0)まで通っている。

リンク切断時以外でout_bufが空になれるのは、TServer.Flushの
out_buf.Delete(0);
の一箇所だけ。だから、考えられるのは
TCPSocket_SendStringに失敗して、なおかつlast_error=0??

TCPSocket_SendStringの前にsleep(5)としたら現象が出なくなった。
ソケットが忙しくならないように気をつければいいのかもしれない
Compile関数の最後でFlushをよんでもうまくいく(shuusei241119)
けれどもsleep(5)のほうが解決方法としてきちんとしている気がする

shuusei241119:リモート参照の完了が遅いバグを修正(report by むさ)

diff --dos -urN 241118/SlavaNap.dof 241119/SlavaNap.dof
--- 241118/SlavaNap.dof	Fri Mar 12 00:42:30 2004
+++ 241119/SlavaNap.dof	Sun Mar 14 02:57:56 2004
@@ -79,5 +79,5 @@
 LegalTrademarks=http://www.slavanap.org/
 OriginalFilename=slavanap.exe
 ProductName=Delphi6でコンパイルしてあります
-ProductVersion=2.4.1.108.118
-Comments=shuusei241118:チャンネルにいるMod+をユーザーにしたとき起きるバグを修正
+ProductVersion=2.4.1.108.119
+Comments=shuusei241119:リモート参照の完了が遅いバグを修正(report by むさ)
Binary files 241118/SlavaNap.res and 241119/SlavaNap.res differ
diff --dos -urN 241118/constants.pas 241119/constants.pas
--- 241118/constants.pas	Fri Mar 12 00:04:12 2004
+++ 241119/constants.pas	Sun Mar 14 02:54:16 2004
@@ -27,8 +27,8 @@
  SLAVANAP_VERSION             = '2.4.1';
  SLAVANAP_BUILD               = '108';
  SLAVANAP_BUILD_DATE          = '24 January 2003';
- SLAVANAP_SHUUSEI             = '118';
- SLAVANAP_SHUUSEI_DATE        = '11 March 2004';
+ SLAVANAP_SHUUSEI             = '119';
+ SLAVANAP_SHUUSEI_DATE        = '14 March 2004';
  SLAVANAP_VERSION_SHORT       = SLAVANAP_TITLE+' '+SLAVANAP_VERSION;
  SLAVANAP_FULL                = SLAVANAP_TITLE+' '+SLAVANAP_VERSION+
                                 ' (build '+SLAVANAP_BUILD+
Binary files 241118/output/SlavaNap.exe and 241119/output/SlavaNap.exe differ
diff --dos -urN 241118/servers.pas 241119/servers.pas
--- 241118/servers.pas	Sat Mar 06 05:29:18 2004
+++ 241119/servers.pas	Sun Mar 14 02:52:06 2004
@@ -541,9 +541,11 @@
      if (new_mem-old_mem)>POSSIBLE_LEAK then
       DebugLog('Possible leak in TServer.Compile (2): '+IntToStr(new_mem-old_mem)+' bytes allocated');
      {$ENDIF}
+     Flush;
      exit;
    end;
  end;
+ Flush;
 end;
 
 procedure TServer.Flush;