Browse Source

Experimental GUI: integration fixes for V4 core

Herman Schoenfeld 6 years ago
parent
commit
4f38b5f6e6

+ 5 - 6
src/gui-experimental/UCTRLSyncronization.lfm

@@ -10,7 +10,6 @@ object CTRLSyncronization: TCTRLSyncronization
   ClientWidth = 728
   ClientWidth = 728
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
-  LCLVersion = '2.0.2.0'
   object paSplash: TPanel
   object paSplash: TPanel
     Left = 0
     Left = 0
     Height = 428
     Height = 428
@@ -44375,24 +44374,24 @@ object CTRLSyncronization: TCTRLSyncronization
       Left = 152
       Left = 152
       Height = 32
       Height = 32
       Top = 32
       Top = 32
-      Width = 145
+      Width = 105
       Alignment = taRightJustify
       Alignment = taRightJustify
       AutoSize = False
       AutoSize = False
       Caption = 'Node Status:'
       Caption = 'Node Status:'
-      Font.Height = -24
+      Font.Height = -16
       Font.Style = [fsBold]
       Font.Style = [fsBold]
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object lblNodeStatus: TLabel
     object lblNodeStatus: TLabel
-      Left = 304
+      Left = 264
       Height = 32
       Height = 32
       Top = 32
       Top = 32
-      Width = 411
+      Width = 451
       Anchors = [akTop, akLeft, akRight]
       Anchors = [akTop, akLeft, akRight]
       AutoSize = False
       AutoSize = False
       Caption = 'Initialising'
       Caption = 'Initialising'
-      Font.Height = -24
+      Font.Height = -16
       Font.Style = [fsBold]
       Font.Style = [fsBold]
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False

+ 12 - 11
src/gui-experimental/UCTRLSyncronization.pas

@@ -65,7 +65,7 @@ type
     FMinedBlocksCount: Integer;
     FMinedBlocksCount: Integer;
     FShowSplash : boolean;
     FShowSplash : boolean;
     FMessagesUnreadCount : Integer;
     FMessagesUnreadCount : Integer;
-    procedure OnLoading(Sender: TObject; const message : AnsiString; curPos, totalCount : Int64);
+    procedure OnLoading(Sender: TObject; const message : String; curPos, totalCount : Int64);
     procedure OnLoaded(Sender: TObject);
     procedure OnLoaded(Sender: TObject);
     procedure SetMinedBlocksCount(const Value: Integer);
     procedure SetMinedBlocksCount(const Value: Integer);
     procedure SetShowSplash(ABool : boolean);
     procedure SetShowSplash(ABool : boolean);
@@ -102,6 +102,7 @@ begin
   TUserInterface.BlocksChanged.Add(OnBlocksChanged);
   TUserInterface.BlocksChanged.Add(OnBlocksChanged);
   TUserInterface.UIRefreshTimer.Add(OnUIRefreshTimer);
   TUserInterface.UIRefreshTimer.Add(OnUIRefreshTimer);
   TUserInterface.NodeMessageEvent.Add(OnNodeMessageEvent);
   TUserInterface.NodeMessageEvent.Add(OnNodeMessageEvent);
+
   FMessagesUnreadCount := 0;
   FMessagesUnreadCount := 0;
 end;
 end;
 
 
@@ -124,15 +125,15 @@ begin
   UpdateBlockChainState;
   UpdateBlockChainState;
 end;
 end;
 
 
-procedure TCTRLSyncronization.OnLoading(Sender : TObject; const message : AnsiString; curPos, totalCount : Int64);
-var LPercent : String;
+procedure TCTRLSyncronization.OnLoading(Sender: TObject; const message : String; curPos, totalCount : Int64);
+var pct : String;
 begin
 begin
-    if (totalCount>0) then
-      LPercent := Format('%.1f',[curPos*100/totalCount])+'%'
-    else
-      LPercent := '';
-
-    SetStatusText(clGreen, message+' '+LPercent);
+  if (totalCount>0) then
+    pct := Format('%.2f',[curPos*100/totalCount])+'%'
+  else
+    pct := '';
+  pct := message + ' ' + pct;
+  SetStatusText(clGreen, pct);
 end;
 end;
 
 
 procedure TCTRLSyncronization.OnLoaded(Sender: TObject);
 procedure TCTRLSyncronization.OnLoaded(Sender: TObject);
@@ -148,8 +149,8 @@ end;
 
 
 procedure TCTRLSyncronization.OnUIRefreshTimer(Sender: TObject);
 procedure TCTRLSyncronization.OnUIRefreshTimer(Sender: TObject);
 begin
 begin
-  UpdateBlockChainState;
-  UpdateNodeStatus;
+    UpdateBlockChainState;
+    UpdateNodeStatus;
 end;
 end;
 
 
 procedure TCTRLSyncronization.OnNodeMessageEvent(NetConnection: TNetConnection; MessageData: String);
 procedure TCTRLSyncronization.OnNodeMessageEvent(NetConnection: TNetConnection; MessageData: String);

+ 2 - 75
src/gui-experimental/UFRMMainForm.lfm

@@ -4,13 +4,12 @@ object FRMMainForm: TFRMMainForm
   Top = 44
   Top = 44
   Width = 870
   Width = 870
   Caption = 'Pascal Coin Wallet, JSON-RPC Miner & Explorer'
   Caption = 'Pascal Coin Wallet, JSON-RPC Miner & Explorer'
-  ClientHeight = 600
+  ClientHeight = 580
   ClientWidth = 870
   ClientWidth = 870
   Color = clBtnFace
   Color = clBtnFace
   Constraints.MinHeight = 600
   Constraints.MinHeight = 600
   Constraints.MinWidth = 865
   Constraints.MinWidth = 865
   DockSite = True
   DockSite = True
-  Enabled = False
   Font.Color = clWindowText
   Font.Color = clWindowText
   Font.Height = -11
   Font.Height = -11
   Font.Name = 'Tahoma'
   Font.Name = 'Tahoma'
@@ -22,7 +21,7 @@ object FRMMainForm: TFRMMainForm
   OnResize = FormResize
   OnResize = FormResize
   Position = poScreenCenter
   Position = poScreenCenter
   ShowHint = True
   ShowHint = True
-  Visible = False
+  LCLVersion = '2.1.0.0'
   object paLogoPanel: TPanel
   object paLogoPanel: TPanel
     Left = 0
     Left = 0
     Height = 80
     Height = 80
@@ -156,42 +155,6 @@ object FRMMainForm: TFRMMainForm
       Caption = 'Wallet'
       Caption = 'Wallet'
       object miPrivateKeys: TMenuItem
       object miPrivateKeys: TMenuItem
         Caption = 'Private Keys'
         Caption = 'Private Keys'
-        Bitmap.Data = {
-          36040000424D3604000000000000360000002800000010000000100000000100
-          2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00CCAACCFFCCD599FF99AACCFFCCAA99FF99AACCFFCCAA99FFCCD5
-          CCFFFFFFFF00CCD5CCFFCCAACCFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00332B00FF332B33FF332B33FF332B33FF332B33FF332B33FF332B00FF332B
-          33FF332B33FF332B33FF332B33FF330000FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00332B33FF335533FF332B33FF665533FF332B33FFFFFFFF00998099FF332B
-          33FF665533FF332B33FF335533FF332B33FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00332B33FF662B33FF335533FF332B33FF332B33FFCCD5CCFFFFFFFF00332B
-          33FF332B33FF665533FF332B33FF332B00FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00332B33FF335533FF332B33FF665533FF332B33FFCCD5CCFFCCD599FF332B
-          33FF335533FF332B33FF335566FF332B33FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00332B33FF662B33FF335533FF332B33FF332B33FFFFFFFF00FFD5FFFF332B
-          33FF332B33FF665533FF332B33FF332B00FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00332B33FF332B33FF335533FF662B33FF335533FF332B33FF002B00FF3355
-          33FF332B33FF335533FF332B33FF332B33FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00665533FF665566FF335533FF335533FF665566FF665533FF665566FF6655
-          66FF665533FF335533FF665566FF665533FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00330000FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00CCAACCFF332B00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00000000FFCCD5CCFFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00CCD5CCFF332B33FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00332B33FFCCD5CCFFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00332B33FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00998066FF332B33FFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00330000FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00332B33FF332B33FF998066FF668099FF002B
-          00FF665566FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00665566FF665566FFCCAA
-          99FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
-        }
         Hint = 'Show Private Keys'
         Hint = 'Show Private Keys'
         ImageIndex = 2
         ImageIndex = 2
         ShortCut = 16464
         ShortCut = 16464
@@ -249,42 +212,6 @@ object FRMMainForm: TFRMMainForm
       end
       end
       object miSyncDialog: TMenuItem
       object miSyncDialog: TMenuItem
         Caption = '&Synchronization'
         Caption = '&Synchronization'
-        Bitmap.Data = {
-          36040000424D3604000000000000360000002800000010000000100000000100
-          2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FEFFFFFFFEFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00E5E4E2FFAEACA9FFA6A5A3FFB4B2B0FFEEEE
-          EEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00D3D1CFFF433F3AFF423D37FF625E58FF5E5952FF524F48FF7D79
-          74FF74726CFFF9F9F9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00A8A6A2FF29241DFF4E4A45FF635E57FF615E59FF625F59FF7F7C77FFADAA
-          A8FF3C3832FF4C4842FFEFEEEDFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00D0D0
-          CDFF2F2A24FF77746DFF9C9A96FFFAFAFBFFD7D4D3FFA7A5A2FF827F7CFF605D
-          55FF3E3C33FF3C3930FF46423DFFF3F2F0FFFFFFFF00FFFFFF00FFFFFF007370
-          6BFF625E58FFB4B3B0FFBFBDBAFF433F38FF312D26FF39362EFF3D3A32FF403D
-          36FF434038FF444139FF403C34FF2A261EFFBAB9B5FFFFFFFF00EAEAE9FF2B26
-          1FFFE4E4E3FF6B6762FF2F2C24FF3D3A32FF3D3A31FF302D24FF39362DFF3A37
-          2EFF444139FF434038FF434038FF423F37FF1F1B12FF7C7974FFACAAA7FFE6E3
-          E3FF5D5A53FF39352CFF4D4943FF6E6B67FF7D7B76FFECEBEAFFBBB9B4FF9896
-          93FF3C3830FF423D36FF3B3730FF423F37FFB4B1B0FFCFCFCDFFCFCDCCFFA3A2
-          9DFF2F2C23FF38342EFF837F7BFF605C57FF605C55FF77736FFF65625BFF6E6A
-          65FF37342CFF55514AFFBBBAB6FF5C5852FFFFFFFF00FFFFFF00FFFFFF00312D
-          27FF57544EFFCCCAC7FFC2C0BEFFA19F9CFF92918DFFE8E7E7FFB3B2AEFFB4B3
-          B0FF9C9A98FF999692FF63615CFF716D68FFFFFFFF00FFFFFF00E3E2E1FF3733
-          2BFF9D9996FF76746EFF5E5A54FF5E5954FF6A6660FF7B7974FF706D66FF6E6C
-          67FF605C55FF7B7975FF979490FF7B7974FFFFFFFF00FFFFFF00BEBEBBFF625E
-          5AFF4A4640FF9B9894FFA4A29EFFA5A3A0FF93918DFF9F9D99FF989592FFCCCC
-          CAFFA9A8A5FF73706AFF343028FFEDEDEBFFFFFFFF00FFFFFF00B7B6B4FFFFFF
-          FF005C5954FF46423CFF67635DFF76736DFF83817DFF74716DFF878480FF7470
-          6BFF5D5854FF3B382FFFAEACA9FFFFFFFF00FFFFFF00FFFFFF00F9F9F8FFFFFF
-          FF00FFFFFF007C7A74FF322D26FF74716BFF7F7D77FF65625DFF8D8A84FF5854
-          50FF27231AFFBEBCB9FFFFFFFF00FFFEFFFFFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FEFEFFFFFFFFFF00EEEEEEFF918E8BFF64605AFF6D6A64FF625E58FFA4A1
-          9EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FEFEFEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00
-        }
         Hint = 'Show &Syncronization'
         Hint = 'Show &Syncronization'
         ImageIndex = 4
         ImageIndex = 4
         OnClick = miSyncDialogClick
         OnClick = miSyncDialogClick

+ 8 - 0
src/gui-experimental/UFRMMainForm.pas

@@ -108,6 +108,7 @@ type
     procedure CM_ModeChanged(var Msg: TMessage); message CM_PC_ModeChanged;
     procedure CM_ModeChanged(var Msg: TMessage); message CM_PC_ModeChanged;
 
 
     procedure OnAppStarted(Sender: TObject);
     procedure OnAppStarted(Sender: TObject);
+    procedure OnLoading(Sender: TObject; const message : String; curPos, totalCount : Int64);
     procedure OnLoaded(Sender: TObject);
     procedure OnLoaded(Sender: TObject);
     procedure OnConnectivityChanged(Sender: TObject);
     procedure OnConnectivityChanged(Sender: TObject);
     procedure OnNetStatisticsChanged(Sender: TObject);
     procedure OnNetStatisticsChanged(Sender: TObject);
@@ -203,6 +204,7 @@ procedure TFRMMainForm.ActivateFirstTime;
 begin
 begin
   // Event subscriptions on activate, not create, due to load-time sequence
   // Event subscriptions on activate, not create, due to load-time sequence
   TUserInterface.AppStarted.Add(OnAppStarted);
   TUserInterface.AppStarted.Add(OnAppStarted);
+  TUserInterface.Loading.Add(OnLoading);
   TWallet.Keys.OnChanged.Add(OnWalletChanged);
   TWallet.Keys.OnChanged.Add(OnWalletChanged);
   TNetData.NetData.OnConnectivityChanged.Add(OnConnectivityChanged);
   TNetData.NetData.OnConnectivityChanged.Add(OnConnectivityChanged);
   TUserInterface.NetStatisticsChanged.Add(OnNetStatisticsChanged);
   TUserInterface.NetStatisticsChanged.Add(OnNetStatisticsChanged);
@@ -214,6 +216,7 @@ end;
 procedure TFRMMainForm.FormDestroy(Sender: TObject);
 procedure TFRMMainForm.FormDestroy(Sender: TObject);
 begin
 begin
   TUserInterface.AppStarted.Remove(OnAppStarted);
   TUserInterface.AppStarted.Remove(OnAppStarted);
+  TUserInterface.Loading.Remove(OnLoading);
   TWallet.Keys.OnChanged.Remove(OnWalletChanged);
   TWallet.Keys.OnChanged.Remove(OnWalletChanged);
   TNetData.NetData.OnConnectivityChanged.Remove(OnConnectivityChanged);
   TNetData.NetData.OnConnectivityChanged.Remove(OnConnectivityChanged);
   TUserInterface.NetStatisticsChanged.Remove(OnNetStatisticsChanged);
   TUserInterface.NetStatisticsChanged.Remove(OnNetStatisticsChanged);
@@ -354,6 +357,11 @@ begin
   RefreshConnectionStatusDisplay;
   RefreshConnectionStatusDisplay;
 end;
 end;
 
 
+procedure TFRMMainForm.OnLoading(Sender: TObject; const message : String; curPos, totalCount : Int64);
+begin
+  // TODO: show progress bar
+end;
+
 procedure TFRMMainForm.OnConnectivityChanged(Sender: TObject);
 procedure TFRMMainForm.OnConnectivityChanged(Sender: TObject);
 begin
 begin
   // Ensure handled in UI thread
   // Ensure handled in UI thread

+ 91 - 44
src/gui-experimental/UUserInterface.pas

@@ -32,16 +32,31 @@ uses
   UFRMLogs, UFRMMessages, UFRMNodes, UFRMBlockExplorer, UFRMWalletKeys, UPCOrderedLists {$IFDEF TESTNET},UFRMRandomOperations, UAccountKeyStorage{$ENDIF};
   UFRMLogs, UFRMMessages, UFRMNodes, UFRMBlockExplorer, UFRMWalletKeys, UPCOrderedLists {$IFDEF TESTNET},UFRMRandomOperations, UAccountKeyStorage{$ENDIF};
 
 
 type
 type
-  { Forward Declarations }
-
-  TLoadDatabaseThread = class;
 
 
   { TUserInterfaceState }
   { TUserInterfaceState }
+
   TUserInterfaceState = (uisLoading, uisLoaded, uisDiscoveringPeers, uisSyncronizingBlockchain, uisActive, uisIsolated, uisDisconnected, uisError);
   TUserInterfaceState = (uisLoading, uisLoaded, uisDiscoveringPeers, uisSyncronizingBlockchain, uisActive, uisIsolated, uisDisconnected, uisError);
 
 
   { TUserInterface }
   { TUserInterface }
 
 
   TUserInterface = class
   TUserInterface = class
+    private type
+
+      { TLoadingThread }
+
+      TLoadingThread = Class(TPCThread)
+      private
+        FLastTC : TTickCount;
+        FMessage : String;
+        FCurPos : Int64;
+        FTotalCount : Int64;
+        procedure OnProgressNotify(sender : TObject; const message : String; curPos, totalCount : Int64);
+        procedure ThreadSafeNotify;
+        procedure ThreadSafeNotifyLoaded;
+      protected
+        procedure BCExecute; override;
+      End;
+
     private
     private
       // Root-form
       // Root-form
       FUILock : TPCCriticalSection; static;
       FUILock : TPCCriticalSection; static;
@@ -90,6 +105,7 @@ type
       FUIRefreshTimer : TNotifyManyEvent; static;
       FUIRefreshTimer : TNotifyManyEvent; static;
       FState : TUserInterfaceState; static;
       FState : TUserInterfaceState; static;
       FStateText : String; static;
       FStateText : String; static;
+      FLoadingThread : TThread; static;
 
 
       // Getters/Setters
       // Getters/Setters
       class function GetEnabled : boolean; static;
       class function GetEnabled : boolean; static;
@@ -107,7 +123,7 @@ type
 
 
       // Aux
       // Aux
       class procedure NotifyLoadedEvent(Sender: TObject);
       class procedure NotifyLoadedEvent(Sender: TObject);
-      class procedure NotifyLoadingEvent(Sender: TObject; const message: AnsiString; curPos, totalCount: Int64);
+      class procedure NotifyLoadingEvent(Sender: TObject; const message : String; curPos, totalCount : Int64);
       class procedure NotifyStateChanged(Sender: TObject);
       class procedure NotifyStateChanged(Sender: TObject);
       class procedure NotifyAccountsChangedEvent(Sender: TObject);
       class procedure NotifyAccountsChangedEvent(Sender: TObject);
       class procedure NotifyBlocksChangedEvent(Sender: TObject);
       class procedure NotifyBlocksChangedEvent(Sender: TObject);
@@ -201,14 +217,6 @@ type
       class procedure ShowSyncDialog;
       class procedure ShowSyncDialog;
   end;
   end;
 
 
-  { TLoadSafeBoxThread }
-
-  TLoadDatabaseThread = Class(TPCThread)
-  protected
-    procedure OnProgressNotify(sender : TObject; const message : AnsiString; curPos, totalCount : Int64);
-    procedure OnLoaded;
-    procedure BCExecute; override;
-  End;
 
 
   { Exceptions }
   { Exceptions }
 
 
@@ -217,10 +225,61 @@ type
 implementation
 implementation
 
 
 uses
 uses
-  UFRMAbout, UFRMNodesIp, UFRMPascalCoinWalletConfig, UFRMPayloadDecoder, UFRMMemoText,
+  Generics.Collections, UFRMAbout, UFRMNodesIp, UFRMPascalCoinWalletConfig, UFRMPayloadDecoder, UFRMMemoText,
   UFileStorage, UTime, USettings, UCoreUtils, UMemory,
   UFileStorage, UTime, USettings, UCoreUtils, UMemory,
   UWIZOperation, UWIZSendPASC, UWIZChangeKey, UWIZEnlistAccountForSale, UWIZDelistAccountFromSale, UWIZChangeAccountInfo, UWIZBuyAccount, UCoreObjects;
   UWIZOperation, UWIZSendPASC, UWIZChangeKey, UWIZEnlistAccountForSale, UWIZDelistAccountFromSale, UWIZChangeAccountInfo, UWIZBuyAccount, UCoreObjects;
 
 
+{ TUserInterface.TLoadingThread }
+
+procedure TUserInterface.TLoadingThread.OnProgressNotify(sender: TObject; const message: String; curPos, totalCount: Int64);
+var pct : String;
+begin
+  If TPlatform.GetElapsedMilliseconds(FLastTC)>250 then begin
+    FLastTC := TPlatform.GetTickCount;
+    FMessage := Message;
+    FCurPos := curPos;
+    FTotalCount := totalCount;
+    Queue(ThreadSafeNotify);
+  end;
+end;
+
+procedure TUserInterface.TLoadingThread.ThreadSafeNotify;
+begin
+  TUserInterface.NotifyLoadingEvent(Self, FMessage, FCurPos, FTotalCount);
+end;
+
+procedure TUserInterface.TLoadingThread.ThreadSafeNotifyLoaded;
+begin
+  TUserInterface.State := uisLoaded;
+end;
+
+procedure TUserInterface.TLoadingThread.BCExecute;
+Var currentProcess : String;
+begin
+  FLastTC := 0;
+  FMessage := '';
+  FCurPos := 0;
+  FTotalCount:=0;
+  // Read Operations saved from disk
+  TNode.Node.InitSafeboxAndOperations($FFFFFFFF,OnProgressNotify); // New Build 2.1.4 to load pending operations buffer
+  TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
+  TNode.Node.NetServer.Active := true;
+  FLastTC := 0;
+  FMessage := '';
+  FCurPos := 0;
+  FTotalCount:=0;
+  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
+      Queue( ThreadSafeNotify );
+      Sleep(200);
+    end;
+  end;
+  if Not Terminated then begin
+    Queue(ThreadSafeNotifyLoaded);
+  end;
+  TUserInterface.FLoadingThread := nil;
+end;
+
 {%region UI Lifecyle}
 {%region UI Lifecyle}
 
 
 class procedure TUserInterface.StartApplication(mainForm : TForm);
 class procedure TUserInterface.StartApplication(mainForm : TForm);
@@ -268,12 +327,18 @@ begin
     {$IFNDEF LCLCarbon}
     {$IFNDEF LCLCarbon}
     FTrayIcon.Show;
     FTrayIcon.Show;
     {$ENDIF}
     {$ENDIF}
+
+    FDisplayedStartupSyncDialog:=false;
+
+    // Create the UI refresh timer
     FTimerUpdateStatus := TTimer.Create(FMainForm);
     FTimerUpdateStatus := TTimer.Create(FMainForm);
     FTimerUpdateStatus.Enabled := false;
     FTimerUpdateStatus.Enabled := false;
-    FDisplayedStartupSyncDialog:=false;
+    FTimerUpdateStatus.OnTimer := NotifyUIRefreshTimerEvent;
+    FUIRefreshTimer.Add(OnUITimerRefresh);
 
 
     // Create log
     // Create log
     FLog := TLog.Create(nil); // independent component
     FLog := TLog.Create(nil); // independent component
+//    FLog.OnNewLog:= OnNewLog;
     FLog.SaveTypes := [];
     FLog.SaveTypes := [];
 
 
     // Create data directories
     // Create data directories
@@ -319,7 +384,9 @@ begin
     // Reading database
     // Reading database
     State := uisLoading;
     State := uisLoading;
     FLoaded.Add(OnLoaded);
     FLoaded.Add(OnLoaded);
-    TLoadDatabaseThread.Create(false).FreeOnTerminate := true;
+    FLoadingThread := TLoadingThread.Create(true);
+    FLoadingThread.FreeOnTerminate := true;
+    FLoadingThread.Suspended := False;
 
 
     // Init
     // Init
     TNetData.NetData.OnReceivedHelloMessage := NotifyReceivedHelloMessageEvent;
     TNetData.NetData.OnReceivedHelloMessage := NotifyReceivedHelloMessageEvent;
@@ -328,12 +395,6 @@ begin
     TNetData.NetData.OnNodeServersUpdated := NotifyNetNodeServersUpdatedEvent;
     TNetData.NetData.OnNodeServersUpdated := NotifyNetNodeServersUpdatedEvent;
     TNetData.NetData.OnBlackListUpdated := NotifyNetBlackListUpdatedEvent;
     TNetData.NetData.OnBlackListUpdated := NotifyNetBlackListUpdatedEvent;
 
 
-    // Start refresh timer
-    FTimerUpdateStatus.OnTimer := NotifyUIRefreshTimerEvent;
-    FTimerUpdateStatus.Interval := 1000;
-    FTimerUpdateStatus.Enabled := true;
-    FUIRefreshTimer.Add(OnUITimerRefresh); //TODO: move to initialisation?
-
     // open the sync dialog
     // open the sync dialog
     FStarted := true;
     FStarted := true;
     FAppStarted.Invoke(nil);
     FAppStarted.Invoke(nil);
@@ -490,6 +551,11 @@ end;
 class procedure TUserInterface.OnLoaded(Sender: TObject);
 class procedure TUserInterface.OnLoaded(Sender: TObject);
 var LLockedMempool : TPCOperationsComp;
 var LLockedMempool : TPCOperationsComp;
 begin
 begin
+  // Start timer
+  FTimerUpdateStatus.Interval := 1000;
+  FTimerUpdateStatus.Enabled := true;
+
+
   FPoolMiningServer := TPoolMiningServer.Create;
   FPoolMiningServer := TPoolMiningServer.Create;
   FPoolMiningServer.Port := TSettings.MinerServerRpcPort;
   FPoolMiningServer.Port := TSettings.MinerServerRpcPort;
   FPoolMiningServer.MinerAccountKey := TWallet.MiningKey;
   FPoolMiningServer.MinerAccountKey := TWallet.MiningKey;
@@ -865,7 +931,7 @@ var
   sl : TStrings;
   sl : TStrings;
   ak : TAccountKey;
   ak : TAccountKey;
   i, nmin,nmax : Integer;
   i, nmin,nmax : Integer;
-  l : TList;
+  l : TList<Pointer>;
   Pacsd : PAccountKeyStorageData;
   Pacsd : PAccountKeyStorageData;
   acc : TAccount;
   acc : TAccount;
 begin
 begin
@@ -1157,6 +1223,8 @@ begin
   if AState = FState then
   if AState = FState then
     exit;
     exit;
   FState := AState;
   FState := AState;
+  if (FState = uisLoaded) then
+    NotifyLoadedEvent(nil);
   NotifyStateChanged(nil);
   NotifyStateChanged(nil);
 end;
 end;
 
 
@@ -1165,7 +1233,7 @@ begin
   TUserInterface.FLoaded.Invoke(Sender);
   TUserInterface.FLoaded.Invoke(Sender);
 end;
 end;
 
 
-class procedure TUserInterface.NotifyLoadingEvent(Sender: TObject; const message: AnsiString; curPos, totalCount: Int64);
+class procedure TUserInterface.NotifyLoadingEvent(Sender: TObject; const message : String; curPos, totalCount : Int64);
 begin
 begin
   TUserInterface.FLoading.Invoke(Sender, message, curPos, totalCount);
   TUserInterface.FLoading.Invoke(Sender, message, curPos, totalCount);
 end;
 end;
@@ -1227,27 +1295,6 @@ end;
 
 
 {%endregion}
 {%endregion}
 
 
-{ TLoadDatabaseThread }
-
-procedure TLoadDatabaseThread.OnProgressNotify(sender: TObject; const message: AnsiString; curPos, totalCount: Int64);
-begin
-  TUserInterface.NotifyLoadingEvent(sender, message, curPos, totalCount);
-end;
-
-procedure TLoadDatabaseThread.OnLoaded;
-begin
-  TUserInterface.NotifyLoadedEvent(Self);
-end;
-
-procedure TLoadDatabaseThread.BCExecute;
-begin
-  // Read Operations saved from disk
-  TNode.Node.InitSafeboxAndOperations($FFFFFFFF, OnProgressNotify);
-  TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
-  TNode.Node.NetServer.Active := true;
-  Synchronize( OnLoaded );
-end;
-
 initialization
 initialization
 // TODO - any startup code needed here?
 // TODO - any startup code needed here?
 finalization
 finalization

+ 5 - 1
src/pascalcoin_wallet_experimental.lpi

@@ -36,10 +36,14 @@
               <SyntaxMode Value="Delphi"/>
               <SyntaxMode Value="Delphi"/>
             </SyntaxOptions>
             </SyntaxOptions>
           </Parsing>
           </Parsing>
+          <CodeGeneration>
+            <Optimizations>
+              <OptimizationLevel Value="0"/>
+            </Optimizations>
+          </CodeGeneration>
           <Linking>
           <Linking>
             <Debugging>
             <Debugging>
               <DebugInfoType Value="dsDwarf2Set"/>
               <DebugInfoType Value="dsDwarf2Set"/>
-              <UseHeaptrc Value="True"/>
               <TrashVariables Value="True"/>
               <TrashVariables Value="True"/>
               <UseExternalDbgSyms Value="True"/>
               <UseExternalDbgSyms Value="True"/>
             </Debugging>
             </Debugging>