Browse Source

Visual info when downloading safebox

This allows a better information to the user when downloading the safebox for first time and does not freezes app
PascalCoin 7 years ago
parent
commit
e0b4625e62
4 changed files with 80 additions and 28 deletions
  1. 24 7
      src/core/UNetProtocol.pas
  2. 2 2
      src/core/UNode.pas
  3. 2 2
      src/core/URPC.pas
  4. 52 17
      src/gui-classic/UFRMWallet.pas

+ 24 - 7
src/core/UNetProtocol.pas

@@ -256,6 +256,7 @@ Type
     FRegisteredRequests : TPCThreadList;
     FRegisteredRequests : TPCThreadList;
     FIsDiscoveringServers : Boolean;
     FIsDiscoveringServers : Boolean;
     FIsGettingNewBlockChainFromClient : Boolean;
     FIsGettingNewBlockChainFromClient : Boolean;
+    FNewBlockChainFromClientStatus : String;
     FOnConnectivityChanged : TNotifyManyEvent;
     FOnConnectivityChanged : TNotifyManyEvent;
     FOnNetConnectionsUpdated: TNotifyEvent;
     FOnNetConnectionsUpdated: TNotifyEvent;
     FOnNodeServersUpdated: TNotifyEvent;
     FOnNodeServersUpdated: TNotifyEvent;
@@ -311,12 +312,13 @@ Type
     Function FindConnectionByClientRandomValue(Sender : TNetConnection) : TNetConnection;
     Function FindConnectionByClientRandomValue(Sender : TNetConnection) : TNetConnection;
     Procedure DiscoverServers;
     Procedure DiscoverServers;
     Procedure DisconnectClients;
     Procedure DisconnectClients;
+    procedure OnReadingNewSafeboxProgressNotify(sender : TObject; const mesage : AnsiString; curPos, totalCount : Int64);
     Procedure GetNewBlockChainFromClient(Connection : TNetConnection; const why : String);
     Procedure GetNewBlockChainFromClient(Connection : TNetConnection; const why : String);
     Property NodeServersAddresses : TOrderedServerAddressListTS read FNodeServersAddresses;
     Property NodeServersAddresses : TOrderedServerAddressListTS read FNodeServersAddresses;
     Property NetConnections : TPCThreadList read FNetConnections;
     Property NetConnections : TPCThreadList read FNetConnections;
     Property NetStatistics : TNetStatistics read FNetStatistics;
     Property NetStatistics : TNetStatistics read FNetStatistics;
     Property IsDiscoveringServers : Boolean read FIsDiscoveringServers;
     Property IsDiscoveringServers : Boolean read FIsDiscoveringServers;
-    Property IsGettingNewBlockChainFromClient : Boolean read FIsGettingNewBlockChainFromClient;
+    function IsGettingNewBlockChainFromClient(var status : AnsiString) : Boolean;
     Property MaxRemoteOperationBlock : TOperationBlock read FMaxRemoteOperationBlock;
     Property MaxRemoteOperationBlock : TOperationBlock read FMaxRemoteOperationBlock;
     Property NodePrivateKey : TECPrivateKey read FNodePrivateKey;
     Property NodePrivateKey : TECPrivateKey read FNodePrivateKey;
     property OnConnectivityChanged : TNotifyManyEvent read FOnConnectivityChanged;
     property OnConnectivityChanged : TNotifyManyEvent read FOnConnectivityChanged;
@@ -1158,6 +1160,7 @@ begin
   FLastRequestId := 0;
   FLastRequestId := 0;
   FNetConnections := TPCThreadList.Create('TNetData_NetConnections');
   FNetConnections := TPCThreadList.Create('TNetData_NetConnections');
   FIsGettingNewBlockChainFromClient := false;
   FIsGettingNewBlockChainFromClient := false;
+  FNewBlockChainFromClientStatus := '';
   FNodePrivateKey := TECPrivateKey.Create;
   FNodePrivateKey := TECPrivateKey.Create;
   FNodePrivateKey.GenerateRandomPrivateKey(CT_Default_EC_OpenSSL_NID);
   FNodePrivateKey.GenerateRandomPrivateKey(CT_Default_EC_OpenSSL_NID);
   FThreadCheckConnections := TThreadCheckConnections.Create(Self);
   FThreadCheckConnections := TThreadCheckConnections.Create(Self);
@@ -1802,6 +1805,7 @@ Const CT_LogSender = 'GetNewBlockChainFromClient';
     errors : AnsiString;
     errors : AnsiString;
     chunks : Array of TSafeBoxChunkData;
     chunks : Array of TSafeBoxChunkData;
     i : Integer;
     i : Integer;
+    newSafeBox : TPCSafeBox;
   Begin
   Begin
     Result := False;
     Result := False;
     // Will try to download penultimate saved safebox
     // Will try to download penultimate saved safebox
@@ -1821,6 +1825,8 @@ Const CT_LogSender = 'GetNewBlockChainFromClient';
       try
       try
         // Will obtain chunks of 10000 blocks each
         // Will obtain chunks of 10000 blocks each
         for i:=0 to ((_blockcount-1) DIV 10000) do begin // Bug v3.0.1 and minors
         for i:=0 to ((_blockcount-1) DIV 10000) do begin // Bug v3.0.1 and minors
+          FNewBlockChainFromClientStatus := Format('Receiving new safebox with %d blocks (step %d/%d) from %s',
+            [_blockcount,i+1,((_blockcount-1) DIV 10000)+1,Connection.ClientRemoteAddr]);
           receiveChunk := TMemoryStream.Create;
           receiveChunk := TMemoryStream.Create;
           if (Not DownloadSafeBoxChunk(_blockcount,op.initial_safe_box_hash,(i*10000),((i+1)*10000)-1,receiveChunk,safeBoxHeader,errors)) then begin
           if (Not DownloadSafeBoxChunk(_blockcount,op.initial_safe_box_hash,(i*10000),((i+1)*10000)-1,receiveChunk,safeBoxHeader,errors)) then begin
             receiveChunk.Free;
             receiveChunk.Free;
@@ -1862,10 +1868,9 @@ Const CT_LogSender = 'GetNewBlockChainFromClient';
       // Now receiveData is the ALL safebox
       // Now receiveData is the ALL safebox
       TNode.Node.DisableNewBlocks;
       TNode.Node.DisableNewBlocks;
       try
       try
-        TNode.Node.Bank.SafeBox.StartThreadSafe;
-        try
+          FNewBlockChainFromClientStatus := Format('Received new safebox with %d blocks from %s',[_blockcount,Connection.ClientRemoteAddr]);
           receiveData.Position:=0;
           receiveData.Position:=0;
-          If TNode.Node.Bank.LoadBankFromStream(receiveData,True,Nil,errors) then begin
+          If TNode.Node.Bank.LoadBankFromStream(receiveData,True,OnReadingNewSafeboxProgressNotify,errors) then begin
             TLog.NewLog(ltInfo,ClassName,'Received new safebox!');
             TLog.NewLog(ltInfo,ClassName,'Received new safebox!');
             If Not IsMyBlockchainValid then begin
             If Not IsMyBlockchainValid then begin
               TNode.Node.Bank.Storage.EraseStorage;
               TNode.Node.Bank.Storage.EraseStorage;
@@ -1877,9 +1882,6 @@ Const CT_LogSender = 'GetNewBlockChainFromClient';
             Connection.DisconnectInvalidClient(false,'Cannot load from stream! '+errors);
             Connection.DisconnectInvalidClient(false,'Cannot load from stream! '+errors);
             exit;
             exit;
           end;
           end;
-        finally
-          TNode.Node.Bank.SafeBox.EndThreadSave;
-        end;
       finally
       finally
         TNode.Node.EnableNewBlocks;
         TNode.Node.EnableNewBlocks;
       end;
       end;
@@ -1905,6 +1907,7 @@ begin
   end else TLog.NewLog(ltdebug,CT_LogSender,'Starting receiving: '+why);
   end else TLog.NewLog(ltdebug,CT_LogSender,'Starting receiving: '+why);
   Try
   Try
     FIsGettingNewBlockChainFromClient := true;
     FIsGettingNewBlockChainFromClient := true;
+    FNewBlockChainFromClientStatus := Format('Downloading block %d from %s',[Connection.RemoteOperationBlock.block,Connection.ClientRemoteAddr]);
     FMaxRemoteOperationBlock := Connection.FRemoteOperationBlock;
     FMaxRemoteOperationBlock := Connection.FRemoteOperationBlock;
     if TNode.Node.Bank.BlocksCount=0 then begin
     if TNode.Node.Bank.BlocksCount=0 then begin
       TLog.NewLog(ltdebug,CT_LogSender,'I have no blocks');
       TLog.NewLog(ltdebug,CT_LogSender,'I have no blocks');
@@ -1995,6 +1998,12 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TNetData.IsGettingNewBlockChainFromClient(var status: AnsiString): Boolean;
+begin
+  status := FNewBlockChainFromClientStatus;
+  Result := FIsGettingNewBlockChainFromClient;
+end;
+
 procedure TNetData.SetMaxNodeServersAddressesBuffer(AValue: Integer);
 procedure TNetData.SetMaxNodeServersAddressesBuffer(AValue: Integer);
 begin
 begin
   if FMaxNodeServersAddressesBuffer=AValue then Exit;
   if FMaxNodeServersAddressesBuffer=AValue then Exit;
@@ -2086,6 +2095,14 @@ begin
   FNetDataNotifyEventsThread.FNotifyOnStatisticsChanged := true;
   FNetDataNotifyEventsThread.FNotifyOnStatisticsChanged := true;
 end;
 end;
 
 
+procedure TNetData.OnReadingNewSafeboxProgressNotify(sender: TObject; const mesage: AnsiString; curPos, totalCount: Int64);
+Var pct : String;
+begin
+  if (totalCount>0) then pct := FormatFloat('0.00',curPos*100/totalCount)+'%' else pct := '';
+
+  FNewBlockChainFromClientStatus := Format('Checking new safebox: %s %s',[mesage,pct]);
+end;
+
 class function TNetData.OperationToText(operation: Word): AnsiString;
 class function TNetData.OperationToText(operation: Word): AnsiString;
 begin
 begin
   case operation of
   case operation of

+ 2 - 2
src/core/UNode.pas

@@ -701,8 +701,8 @@ begin
   CurrentProcess := '';
   CurrentProcess := '';
   if FBank.IsReady(CurrentProcess) then begin
   if FBank.IsReady(CurrentProcess) then begin
     if FNetServer.Active then begin
     if FNetServer.Active then begin
-      if TNetData.NetData.IsGettingNewBlockChainFromClient then begin
-        CurrentProcess := 'Obtaining valid BlockChain - Found block '+inttostr(TNetData.NetData.MaxRemoteOperationBlock.block);
+      if TNetData.NetData.IsGettingNewBlockChainFromClient(CurrentProcess) then begin
+        CurrentProcess := CurrentProcess;
       end else begin
       end else begin
         if TNetData.NetData.MaxRemoteOperationBlock.block>FOperations.OperationBlock.block then begin
         if TNetData.NetData.MaxRemoteOperationBlock.block>FOperations.OperationBlock.block then begin
           CurrentProcess := 'Found block '+inttostr(TNetData.NetData.MaxRemoteOperationBlock.block)+' (Wait until downloaded)';
           CurrentProcess := 'Found block '+inttostr(TNetData.NetData.MaxRemoteOperationBlock.block)+' (Wait until downloaded)';

+ 2 - 2
src/core/URPC.pas

@@ -3404,8 +3404,8 @@ begin
         GetResultObject.GetAsVariant('ready').Value := True;
         GetResultObject.GetAsVariant('ready').Value := True;
         if TNetData.NetData.IsDiscoveringServers then begin
         if TNetData.NetData.IsDiscoveringServers then begin
           GetResultObject.GetAsVariant('status_s').Value := 'Discovering servers';
           GetResultObject.GetAsVariant('status_s').Value := 'Discovering servers';
-        end else if TNetData.NetData.IsGettingNewBlockChainFromClient then begin
-          GetResultObject.GetAsVariant('status_s').Value := 'Obtaining new blockchain';
+        end else if TNetData.NetData.IsGettingNewBlockChainFromClient(ansistr) then begin
+          GetResultObject.GetAsVariant('status_s').Value := ansistr;
         end else begin
         end else begin
           GetResultObject.GetAsVariant('status_s').Value := 'Running';
           GetResultObject.GetAsVariant('status_s').Value := 'Running';
         end;
         end;

+ 52 - 17
src/gui-classic/UFRMWallet.pas

@@ -226,9 +226,11 @@ type
     procedure cbFilterAccountsClick(Sender: TObject);
     procedure cbFilterAccountsClick(Sender: TObject);
     procedure MiFindOperationbyOpHashClick(Sender: TObject);
     procedure MiFindOperationbyOpHashClick(Sender: TObject);
     procedure MiAccountInformationClick(Sender: TObject);
     procedure MiAccountInformationClick(Sender: TObject);
+    procedure FormClose(Sender: TObject; var Action: TCloseAction);
   private
   private
     FLastNodesCacheUpdatedTS : TDateTime;
     FLastNodesCacheUpdatedTS : TDateTime;
     FBackgroundPanel : TPanel;
     FBackgroundPanel : TPanel;
+    FBackgroundLabel : TLabel;
     FMinersBlocksFound: Integer;
     FMinersBlocksFound: Integer;
     procedure SetMinersBlocksFound(const Value: Integer);
     procedure SetMinersBlocksFound(const Value: Integer);
     Procedure CheckIsReady;
     Procedure CheckIsReady;
@@ -264,6 +266,7 @@ type
     FRPCServer : TRPCServer;
     FRPCServer : TRPCServer;
     FMustProcessWalletChanged : Boolean;
     FMustProcessWalletChanged : Boolean;
     FMustProcessNetConnectionUpdated : Boolean;
     FMustProcessNetConnectionUpdated : Boolean;
+    FThreadActivate : TObject;
     Procedure OnNewAccount(Sender : TObject);
     Procedure OnNewAccount(Sender : TObject);
     Procedure OnReceivedHelloMessage(Sender : TObject);
     Procedure OnReceivedHelloMessage(Sender : TObject);
     Procedure OnNetStatisticsChanged(Sender : TObject);
     Procedure OnNetStatisticsChanged(Sender : TObject);
@@ -331,22 +334,32 @@ Type
 procedure TThreadActivate.OnProgressNotify(sender: TObject; const mesage: AnsiString; curPos, totalCount: Int64);
 procedure TThreadActivate.OnProgressNotify(sender: TObject; const mesage: AnsiString; curPos, totalCount: Int64);
 var pct : String;
 var pct : String;
 begin
 begin
-  If Assigned(FRMWallet.FBackgroundPanel) then begin
-   // FRMWallet.FBackgroundPanel.Font.Color:=lblNodeStatus.Font.Color;
+  If Assigned(FRMWallet.FBackgroundLabel) then begin
     if (totalCount>0) then pct := Format('%.1f',[curPos*100/totalCount])+'%'
     if (totalCount>0) then pct := Format('%.1f',[curPos*100/totalCount])+'%'
     else pct := '';
     else pct := '';
-    FRMWallet.FBackgroundPanel.Caption:='Please wait until finished: '+mesage+' '+pct;
+    FRMWallet.FBackgroundLabel.Caption:='Please wait until finished: '+mesage+' '+pct;
   end;
   end;
 end;
 end;
 
 
 procedure TThreadActivate.BCExecute;
 procedure TThreadActivate.BCExecute;
+Var node : TNode;
+  currentProcess : AnsiString;
 begin
 begin
   // Read Operations saved from disk
   // Read Operations saved from disk
   TNode.Node.InitSafeboxAndOperations($FFFFFFFF,OnProgressNotify); // New Build 2.1.4 to load pending operations buffer
   TNode.Node.InitSafeboxAndOperations($FFFFFFFF,OnProgressNotify); // New Build 2.1.4 to load pending operations buffer
   TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
   TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
   TNode.Node.NetServer.Active := true;
   TNode.Node.NetServer.Active := true;
-  Synchronize( FRMWallet.DoUpdateAccounts );
-  Synchronize( FRMWallet.FinishedLoadingApp );
+  if (TNode.Node.Bank.BlocksCount<=1) then begin
+    while (Not Terminated) And (Not TNode.Node.IsReady(currentProcess) Or (TNode.Node.Bank.BlocksCount<=1)) do begin
+      FRMWallet.FBackgroundLabel.Caption:='Please wait until finished: '+currentProcess;
+      Sleep(5);
+    end;
+  end;
+  if Not Terminated then begin
+    Synchronize( FRMWallet.DoUpdateAccounts );
+    Synchronize( FRMWallet.FinishedLoadingApp );
+  end;
+  FRMWallet.FThreadActivate := Nil;
 end;
 end;
 
 
 { TFRMWallet }
 { TFRMWallet }
@@ -400,7 +413,9 @@ begin
     if (i<Integer(Low(TShowHashRateAs))) Or (i>Integer(High(TShowHashRateAs))) then i := Integer({$IFDEF TESTNET}hr_Mega{$ELSE}hr_Tera{$ENDIF});
     if (i<Integer(Low(TShowHashRateAs))) Or (i>Integer(High(TShowHashRateAs))) then i := Integer({$IFDEF TESTNET}hr_Mega{$ELSE}hr_Tera{$ENDIF});
     FBlockChainGrid.HashRateAs := TShowHashRateAs(i);
     FBlockChainGrid.HashRateAs := TShowHashRateAs(i);
     // Reading database
     // Reading database
-    TThreadActivate.Create(false).FreeOnTerminate := true;
+    FThreadActivate := TThreadActivate.Create(true);
+    TThreadActivate(FThreadActivate).FreeOnTerminate := true;
+    TThreadActivate(FThreadActivate).Suspended := False;
     UpdateConfigChanged;
     UpdateConfigChanged;
     UpdateNodeStatus;
     UpdateNodeStatus;
   Except
   Except
@@ -778,9 +793,9 @@ begin
   FNode.Operations.AccountKey := GetAccountKeyForMiner;
   FNode.Operations.AccountKey := GetAccountKeyForMiner;
   FPoolMiningServer.Active := FAppParams.ParamByName[CT_PARAM_JSONRPCMinerServerActive].GetAsBoolean(true);
   FPoolMiningServer.Active := FAppParams.ParamByName[CT_PARAM_JSONRPCMinerServerActive].GetAsBoolean(true);
   FPoolMiningServer.OnMiningServerNewBlockFound := OnMiningServerNewBlockFound;
   FPoolMiningServer.OnMiningServerNewBlockFound := OnMiningServerNewBlockFound;
-  If Assigned(FBackgroundPanel) then begin
-    FreeAndNil(FBackgroundPanel);
-  end;
+  FreeAndNil(FBackgroundLabel);
+  FreeAndNil(FBackgroundPanel);
+
   PageControl.Visible:=True;
   PageControl.Visible:=True;
   PageControl.Enabled:=True;
   PageControl.Enabled:=True;
 
 
@@ -986,11 +1001,21 @@ begin
   Result := false;
   Result := false;
 end;
 end;
 
 
+procedure TFRMWallet.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+  if Assigned(FThreadActivate) then begin
+    TThreadActivate(FThreadActivate).Terminate;
+    FThreadActivate := Nil;
+  end;
+end;
+
 procedure TFRMWallet.FormCreate(Sender: TObject);
 procedure TFRMWallet.FormCreate(Sender: TObject);
 Var i : Integer;
 Var i : Integer;
 begin
 begin
   FLastNodesCacheUpdatedTS := Now;
   FLastNodesCacheUpdatedTS := Now;
   FBackgroundPanel := Nil;
   FBackgroundPanel := Nil;
+  FBackgroundLabel := Nil;
+  FThreadActivate := Nil;
   FMustProcessWalletChanged := false;
   FMustProcessWalletChanged := false;
   FMustProcessNetConnectionUpdated := false;
   FMustProcessNetConnectionUpdated := false;
   FRPCServer := Nil;
   FRPCServer := Nil;
@@ -1065,6 +1090,14 @@ begin
   FBackgroundPanel.Parent:=Self;
   FBackgroundPanel.Parent:=Self;
   FBackgroundPanel.Align:=alClient;
   FBackgroundPanel.Align:=alClient;
   FBackgroundPanel.Font.Size:=15;
   FBackgroundPanel.Font.Size:=15;
+  FBackgroundPanel.BevelWidth := 10;
+  FBackgroundLabel := TLabel.Create(Self);
+  FBackgroundLabel.Parent := FBackgroundPanel;
+  FBackgroundLabel.Align := alClient;
+  FBackgroundLabel.Layout := tlCenter;
+  FBackgroundLabel.Font.Size := 18;
+  FBackgroundLabel.Alignment := taCenter;
+  FBackgroundLabel.WordWrap := True;
   cbHashRateUnits.Items.Clear;
   cbHashRateUnits.Items.Clear;
   cbHashRateUnits.Items.Add('Kh/s');
   cbHashRateUnits.Items.Add('Kh/s');
   cbHashRateUnits.Items.Add('Mh/s');
   cbHashRateUnits.Items.Add('Mh/s');
@@ -1124,6 +1157,11 @@ Var i : Integer;
 begin
 begin
   TLog.NewLog(ltinfo,Classname,'Destroying form - START');
   TLog.NewLog(ltinfo,Classname,'Destroying form - START');
   Try
   Try
+    if Assigned(FThreadActivate) then begin
+      TThreadActivate(FThreadActivate).Terminate;
+      FThreadActivate := Nil;
+    end;
+
   FreeAndNil(FRPCServer);
   FreeAndNil(FRPCServer);
   FreeAndNil(FPoolMiningServer);
   FreeAndNil(FPoolMiningServer);
   step := 'Saving params';
   step := 'Saving params';
@@ -1698,7 +1736,6 @@ end;
 procedure TFRMWallet.OnNodeKeysActivity(Sender: TObject);
 procedure TFRMWallet.OnNodeKeysActivity(Sender: TObject);
 begin
 begin
   DoUpdateAccounts;
   DoUpdateAccounts;
-//  Application.ProcessMessages; // XXXXXXXXXXX
 end;
 end;
 
 
 procedure TFRMWallet.OnReceivedHelloMessage(Sender: TObject);
 procedure TFRMWallet.OnReceivedHelloMessage(Sender: TObject);
@@ -1858,7 +1895,6 @@ begin
     UpdateConnectionStatus;
     UpdateConnectionStatus;
     UpdateBlockChainState;
     UpdateBlockChainState;
     UpdateNodeStatus;
     UpdateNodeStatus;
-//    Application.ProcessMessages; // XXXXXXXXXXX
   Except
   Except
     On E:Exception do begin
     On E:Exception do begin
       E.Message := 'Exception at TimerUpdate '+E.ClassName+': '+E.Message;
       E.Message := 'Exception at TimerUpdate '+E.ClassName+': '+E.Message;
@@ -1947,7 +1983,6 @@ begin
   // Show Totals:
   // Show Totals:
   lblAccountsBalance.Caption := TAccountComp.FormatMoney(FAccountsGrid.AccountsBalance);
   lblAccountsBalance.Caption := TAccountComp.FormatMoney(FAccountsGrid.AccountsBalance);
   UpdateOperations;
   UpdateOperations;
-//  Application.ProcessMessages; // XXXXXXXXXXX
 end;
 end;
 
 
 procedure TFRMWallet.UpdateAvailableConnections;
 procedure TFRMWallet.UpdateAvailableConnections;
@@ -2126,8 +2161,8 @@ begin
         lblNodeStatus.Font.Color := clGreen;
         lblNodeStatus.Font.Color := clGreen;
         if TNetData.NetData.IsDiscoveringServers then begin
         if TNetData.NetData.IsDiscoveringServers then begin
           lblNodeStatus.Caption := 'Discovering servers';
           lblNodeStatus.Caption := 'Discovering servers';
-        end else if TNetData.NetData.IsGettingNewBlockChainFromClient then begin
-          lblNodeStatus.Caption := 'Obtaining new blockchain';
+        end else if TNetData.NetData.IsGettingNewBlockChainFromClient(status) then begin
+          lblNodeStatus.Caption := 'Obtaining new blockchain '+status;
         end else begin
         end else begin
           lblNodeStatus.Caption := 'Running';
           lblNodeStatus.Caption := 'Running';
         end;
         end;
@@ -2140,9 +2175,9 @@ begin
       lblNodeStatus.Caption := status;
       lblNodeStatus.Caption := status;
     end;
     end;
   end;
   end;
-  If Assigned(FBackgroundPanel) then begin
-    FBackgroundPanel.Font.Color:=lblNodeStatus.Font.Color;
-    FBackgroundPanel.Caption:='Please wait until finished: '+lblNodeStatus.Caption;
+  If Assigned(FBackgroundLabel) then begin
+    FBackgroundLabel.Font.Color:=lblNodeStatus.Font.Color;
+    FBackgroundLabel.Caption:='Please wait until finished: '+lblNodeStatus.Caption;
   end;
   end;
 end;
 end;