tcpserver.onexecute(..)関数内のGUIに処理状態に関する情報を書き込むために、次のコマンドシーケンスを使用しました
ExecuteDUMMYCommand(Global_Send_Record);
BitMap_PaintImageProcess;
TThread.Synchronize(nil, BitMap_PaintImageProcess);
コードは一部のマシンでは正常に機能していますが、一部のマシンでは失敗します。コードの実行はatTThread.Synchronizeコマンドで停止します。これらのマシンでは、関数呼び出しがデッドロックの中に閉じ込められていると思います。背後にある本当の問題を理解するチャンスはありますか?
プロシージャBitMap_PaintImageProcess、ここではビットマップを作成し、多くのペイント作業を行いますが、このコードは実行されないようです。
私は非常に長いコードを説明し、要点を減らしてみます。重大なスレッドの問題は、Bitmapprocessingclass内のビットマップの処理に隠されています。このクラスは、INDYTCPサーバーコンポーネントも含むServerMainFormのGUIProcessingプロシージャ内でアクセスされます。
{--------------- CLASS DEFINITION -----------------------------}
TBitMapProcessingClass = class()
FBitmap : TBitmap;
FList : TListOfSomething;
procedure ProcessTheBitmap(....);
......
(many many functions);
procedure Init;
procedure Free;
Procedure Create;
end;
TMainform = class(TForm)
MyServer : TIdTCPServer;
aBitMaoProcessingClass : TBitMaoProcessingClass;
procedure BitMap_PaintImageProcess;
procedure BitMap_ListProcess;
.....
end;
{------------------------- Implemantation ------------------------------}
procedure TMainform.IndyTCPServer.Onexecute()
begin
.......
ExecuteDUMMYCommand(Global_Send_Record);
BitMap_PaintImageProcess;
TThread.Synchronize(nil, BitMap_PaintImageProcess);
.......
end;
procedure TMainform.BitMap_PaintImageProcess;
begin
DoSomeServerVCLStuff(....);
aBitMapProcessingClass.ProcessTheBitmap;
DoSomeServerVCLStuff(....);
end;