Skip to content

Commit

Permalink
Fixed: Wallet hangs on close
Browse files Browse the repository at this point in the history
  • Loading branch information
xiphon committed Mar 13, 2017
1 parent 6c3ffd3 commit 3b8359a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 38 deletions.
1 change: 0 additions & 1 deletion Units/Forms/UFRMWallet.lfm
Expand Up @@ -13,7 +13,6 @@ object FRMWallet: TFRMWallet
Font.Height = -11
Font.Name = 'Tahoma'
Menu = MainMenu
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
Position = poOwnerFormCenter
Expand Down
62 changes: 28 additions & 34 deletions Units/Forms/UFRMWallet.pas
Expand Up @@ -42,11 +42,12 @@ interface
Type
TThreadActivate = Class(TThread)
protected
FFinished : PBoolean;
FFormCloseEvent : PRTLEvent;
procedure Execute; override;
private
FFinished : Boolean;
public
constructor Create(finished : PBoolean; formCloseEvent : PRTLEvent);
constructor Create;
property Finished : Boolean read FFinished;
end;

{ TFRMWallet }
Expand Down Expand Up @@ -176,7 +177,6 @@ TFRMWallet = class(TForm)
dgBlockChainExplorer: TDrawGrid;
dgOperationsExplorer: TDrawGrid;
MiFindOperationbyOpHash: TMenuItem;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure TimerUpdateStatusTimer(Sender: TObject);
Expand Down Expand Up @@ -282,12 +282,10 @@ TFRMWallet = class(TForm)
{ Public declarations }
Property WalletKeys : TWalletKeysExt read FWalletKeys;
Property MinersBlocksFound : Integer read FMinersBlocksFound write SetMinersBlocksFound;
private

// TODO: remove all that kind of magic after healing the design.
private
FDataLoadingThread : TThreadActivate;
FDataLoadingFinished : Boolean;
FFormCloseEvent : PRTLEvent;
FCaptionOnClose : AnsiString;
end;

var
Expand All @@ -305,27 +303,26 @@ implementation
UThread, UOpTransaction, UECIES, UFRMPascalCoinWalletConfig,
UFRMAbout, UFRMOperation, UFRMWalletKeys, UFRMPayloadDecoder, UFRMNodesIp;

constructor TThreadActivate.Create(finished : PBoolean; formCloseEvent : PRTLEvent);
constructor TThreadActivate.Create;
begin
FFinished := finished;
FFormCloseEvent := formCloseEvent;
FFinished := false;
inherited Create(false);
end;

procedure TThreadActivate.Execute;
begin
// Read Operations saved from disk
TNode.Node.Bank.DiskRestoreFromOperations(CT_MaxBlock);
TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
TNode.Node.NetServer.Active := true;
Synchronize( FRMWallet.DoUpdateAccounts );
Synchronize( FRMWallet.FinishedLoadingApp );

FFinished^ := true;

RTLeventWaitFor(FFormCloseEvent);

FRMWallet.Close;
try
// Read Operations saved from disk
if not TNode.Node.Bank.DiskRestoreFromOperations(CT_MaxBlock, @Terminated) then begin
exit;
end;
TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
TNode.Node.NetServer.Active := true;
Synchronize( FRMWallet.DoUpdateAccounts );
Synchronize( FRMWallet.FinishedLoadingApp );
finally
FFinished := true;
end;
end;

{ TFRMWallet }
Expand Down Expand Up @@ -375,8 +372,7 @@ procedure TFRMWallet.Activate;
FOperationsAccountGrid.Node := FNode;
// Reading database

FFormCloseEvent := RTLEventCreate;
FDataLoadingThread := TThreadActivate.Create(@FDataLoadingFinished, FFormCloseEvent);
FDataLoadingThread := TThreadActivate.Create;

FNodeNotifyEvents.Node := FNode;
// Init
Expand Down Expand Up @@ -894,15 +890,8 @@ procedure TFRMWallet.FormCreate(Sender: TObject);
MinersBlocksFound := 0;
lblBuild.Caption := 'Build: '+CT_ClientAppVersion;
FPoolMiningServer := Nil;
end;

procedure TFRMWallet.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
RTLeventSetEvent(FFormCloseEvent);
if FDataLoadingFinished = false then begin
CloseAction := caNone;
FRMWallet.Caption := 'Pascal Lite Wallet, JSON-RPC Miner & Explorer. Closing...';
end;
FCaptionOnClose := Caption + ' - Closing...';
end;

procedure TFRMWallet.FormDestroy(Sender: TObject);
Expand All @@ -911,10 +900,15 @@ procedure TFRMWallet.FormDestroy(Sender: TObject);
begin
TLog.NewLog(ltinfo,Classname,'Destroying form - START');

FRMWallet.Caption := FCaptionOnClose;

FDataLoadingThread.Terminate;
while not FDataLoadingThread.Finished do begin
Application.ProcessMessages;
Sleep(100);
end;
FDataLoadingThread.WaitFor;
FreeAndNil(FDataLoadingThread);
RTLeventdestroy(FFormCloseEvent);

Try
FreeAndNil(FRPCServer);
Expand Down
11 changes: 8 additions & 3 deletions Units/PascalCoin/UBlockChain.pas
Expand Up @@ -391,7 +391,7 @@ interface
Function LoadOperations(Operations : TPCOperationsComp; Block : Cardinal) : Boolean;
Property SafeBox : TPCSafeBox read FSafeBox;
Function AddNewBlockChainBlock(Operations: TPCOperationsComp; var newBlock: TBlockAccount; var errors: AnsiString; timeAdjustment : Integer = 0): Boolean;
Procedure DiskRestoreFromOperations(max_block : Int64);
function DiskRestoreFromOperations(max_block : Int64; stop : PBoolean = Nil) : Boolean;
Procedure NewLog(Operations: TPCOperationsComp; Logtype: TLogType; Logtxt: AnsiString);
Property OnLog: TPCBankLog read FOnLog write FOnLog;
Property LastOperationBlock : TOperationBlock read FLastOperationBlock;
Expand Down Expand Up @@ -612,7 +612,7 @@ destructor TPCBank.Destroy;
End;
end;

procedure TPCBank.DiskRestoreFromOperations(max_block : Int64);
function TPCBank.DiskRestoreFromOperations(max_block : Int64; stop : PBoolean = Nil) : Boolean;
Var
errors: AnsiString;
newBlock: TBlockAccount;
Expand All @@ -639,7 +639,7 @@ procedure TPCBank.DiskRestoreFromOperations(max_block : Int64);
NewLog(Nil, ltinfo,'Start restoring from disk operations (Max '+inttostr(max_block)+') BlockCount: '+inttostr(BlocksCount)+' Orphan: ' +Storage.Orphan);
Operations := TPCOperationsComp.Create(Self);
try
while ((BlocksCount<=max_block)) do begin
while ((not Assigned(stop)) or (not stop^)) and (BlocksCount <= max_block) do begin
if Storage.BlockExists(BlocksCount) then begin
if Storage.LoadBlockChainBlock(Operations,BlocksCount) then begin
if Not AddNewBlockChainBlock(Operations,newBlock,errors) then begin
Expand All @@ -662,6 +662,11 @@ procedure TPCBank.DiskRestoreFromOperations(max_block : Int64);
finally
FBankLock.Release;
end;
if Assigned(stop) then begin
Result := not stop^;
end else begin
Result := true;
end;
end;

function TPCBank.GetActualCompactTargetHash: Cardinal;
Expand Down

0 comments on commit 3b8359a

Please sign in to comment.