diff options
| -rw-r--r-- | UCore.pas | 167 |
1 files changed, 81 insertions, 86 deletions
@@ -36,7 +36,7 @@ type TWorkerThread = class(TThread) procedure Execute; override; procedure CommitGUIUpdate; public - // Data to updating + // Data to update FProgress1Pos, FProgress2Pos, FProgress1Max, FProgress2Max: Int64; FProgress1Text, FProgress2Text, FLabel1Text, FLabel2Text: string; FGUIProgress1Pos, FGUIProgress2Pos, FGUIProgress1Max, FGUIProgress2Max: Int64; @@ -45,8 +45,7 @@ type TWorkerThread = class(TThread) FCancelMessage: string; FDoneThread, FShowCancelMessage, - FDialogShowDirDelete, FDialogShowOverwrite, FDialogShowNewDir, FDialogShowMsgBox, - FSigDialogDirDelete, FSigDialogOverwrite, FSigDialogNewDir, FSigDialogMsgBox: boolean; + FDialogShowDirDelete, FDialogShowOverwrite, FDialogShowNewDir, FDialogShowMsgBox: boolean; FDialogResultDirDelete, FDialogResultOverwrite, FDialogResultNewDir: integer; FDirDeleteButtonsType: integer; @@ -63,6 +62,8 @@ type TWorkerThread = class(TThread) FMsgBoxStyle: TMessageStyle; FMsgBoxDefault, FMsgBoxEscape, FDialogResultMsgBox: TMessageButton; + FCallbackLockEvent: TSimpleEvent; + // Parameters ProgressForm: TFProgress; @@ -2038,8 +2039,10 @@ procedure ProcessProgressThread(SenderThread: TWorkerThread; ProgressForm: TFPro var AFDirDelete: TFDirDelete; AFOverwrite: TFOverwrite; AFNewDir: TFNewDir; + b: boolean; begin DebugMsg([' ** ProcessProgressThread --begin']); + b := False; try while not SenderThread.FDoneThread do begin // Write('.'); @@ -2086,76 +2089,82 @@ begin // DebugMsg(['After refresh']); try - if SenderThread.FDialogShowDirDelete then begin - AFDirDelete := nil; - try - AFDirDelete := TFDirDelete.Create(SenderThread.ProgressForm as TComponent); - AFDirDelete.Caption := SenderThread.FDirDeleteCaption; - AFDirDelete.AddButtons(SenderThread.FDirDeleteButtonsType); - AFDirDelete.Label1.Caption := SenderThread.FDirDeleteLabel1Text; - AFDirDelete.Label2.Caption := SenderThread.FDirDeleteLabel2Text; - AFDirDelete.Label3.Caption := SenderThread.FDirDeleteLabel3Text; - AFDirDelete.Label2.Visible := SenderThread.FDirDeleteLabel2Visible; - AFDirDelete.Label3.Visible := SenderThread.FDirDeleteLabel3Visible; - SenderThread.FDialogResultDirDelete := Integer(AFDirDelete.Run); - if (SenderThread.FDirDeleteButtonsType = 3) and (SenderThread.FDialogResultDirDelete = 2) and (not SenderThread.ParamBool3) - then case Application.MessageBox(LANGIgnoreError, [mbYes, mbNo{, mbCancel}], mbWarning, mbYes, mbNo) of - mbNo: SenderThread.FDialogResultDirDelete := 1; - mbCancel: SenderThread.FDialogResultDirDelete := 0; - end; - finally - AFDirDelete.Free; + if SenderThread.FDialogShowDirDelete then begin + AFDirDelete := nil; + try + AFDirDelete := TFDirDelete.Create(SenderThread.ProgressForm as TComponent); + AFDirDelete.Caption := SenderThread.FDirDeleteCaption; + AFDirDelete.AddButtons(SenderThread.FDirDeleteButtonsType); + AFDirDelete.Label1.Caption := SenderThread.FDirDeleteLabel1Text; + AFDirDelete.Label2.Caption := SenderThread.FDirDeleteLabel2Text; + AFDirDelete.Label3.Caption := SenderThread.FDirDeleteLabel3Text; + AFDirDelete.Label2.Visible := SenderThread.FDirDeleteLabel2Visible; + AFDirDelete.Label3.Visible := SenderThread.FDirDeleteLabel3Visible; + SenderThread.FDialogResultDirDelete := Integer(AFDirDelete.Run); + if (SenderThread.FDirDeleteButtonsType = 3) and (SenderThread.FDialogResultDirDelete = 2) and (not SenderThread.ParamBool3) + then case Application.MessageBox(LANGIgnoreError, [mbYes, mbNo{, mbCancel}], mbWarning, mbYes, mbNo) of + mbNo: SenderThread.FDialogResultDirDelete := 1; + mbCancel: SenderThread.FDialogResultDirDelete := 0; + end; + finally + AFDirDelete.Free; + end; + SenderThread.FDialogShowDirDelete := False; + b := True; end; - SenderThread.FDialogShowDirDelete := False; - SenderThread.FSigDialogDirDelete := True; - end; - if SenderThread.FDialogShowOverwrite then begin - AFOverwrite := nil; - try - AFOverwrite := TFOverwrite.Create(SenderThread.ProgressForm as TComponent); - AFOverwrite.AddButtons(SenderThread.FOverwriteButtonsType); - AFOverwrite.FromLabel.Caption := SenderThread.FOverwriteFromLabel; - AFOverwrite.FromInfoLabel.Caption := SenderThread.FOverwriteFromInfoLabel; - AFOverwrite.ToLabel.Caption := SenderThread.FOverwriteToLabel; - AFOverwrite.ToInfoLabel.Caption := SenderThread.FOverwriteToInfoLabel; - AFOverwrite.RenameStr := SenderThread.FOverwriteRenameStr; - AFOverwrite.SourceFile := SenderThread.FOverwriteSourceFile; - AFOverwrite.DestFile := SenderThread.FOverwriteDestFile; - SenderThread.FDialogResultOverwrite := Integer(AFOverwrite.Run); - SenderThread.FOverwriteRenameStr := UTF8ToStr(AFOverwrite.RenameStr); - finally - AFOverwrite.Free; + if SenderThread.FDialogShowOverwrite then begin + AFOverwrite := nil; + try + AFOverwrite := TFOverwrite.Create(SenderThread.ProgressForm as TComponent); + AFOverwrite.AddButtons(SenderThread.FOverwriteButtonsType); + AFOverwrite.FromLabel.Caption := SenderThread.FOverwriteFromLabel; + AFOverwrite.FromInfoLabel.Caption := SenderThread.FOverwriteFromInfoLabel; + AFOverwrite.ToLabel.Caption := SenderThread.FOverwriteToLabel; + AFOverwrite.ToInfoLabel.Caption := SenderThread.FOverwriteToInfoLabel; + AFOverwrite.RenameStr := SenderThread.FOverwriteRenameStr; + AFOverwrite.SourceFile := SenderThread.FOverwriteSourceFile; + AFOverwrite.DestFile := SenderThread.FOverwriteDestFile; + SenderThread.FDialogResultOverwrite := Integer(AFOverwrite.Run); + SenderThread.FOverwriteRenameStr := UTF8ToStr(AFOverwrite.RenameStr); + finally + AFOverwrite.Free; + end; + SenderThread.FDialogShowOverwrite := False; + b := True; end; - SenderThread.FDialogShowOverwrite := False; - SenderThread.FSigDialogOverwrite := True; - end; - if SenderThread.FDialogShowNewDir then begin - AFNewDir := nil; - try - AFNewDir := TFNewDir.Create(SenderThread.ProgressForm as TComponent); - AFNewDir.Caption := SenderThread.FNewDirCaption; - AFNewDir.Label1.Caption := SenderThread.FNewDirLabel; - AFNewDir.Entry.Text := SenderThread.FNewDirEdit; - AFNewDir.Entry.SelectAll; - SenderThread.FDialogResultNewDir := Integer(AFNewDir.Run); - SenderThread.FNewDirEdit := AFNewDir.Entry.Text; - finally - AFNewDir.Free; + if SenderThread.FDialogShowNewDir then begin + AFNewDir := nil; + try + AFNewDir := TFNewDir.Create(SenderThread.ProgressForm as TComponent); + AFNewDir.Caption := SenderThread.FNewDirCaption; + AFNewDir.Label1.Caption := SenderThread.FNewDirLabel; + AFNewDir.Entry.Text := SenderThread.FNewDirEdit; + AFNewDir.Entry.SelectAll; + SenderThread.FDialogResultNewDir := Integer(AFNewDir.Run); + SenderThread.FNewDirEdit := AFNewDir.Entry.Text; + finally + AFNewDir.Free; + end; + SenderThread.FDialogShowNewDir := False; + b := True; end; - SenderThread.FDialogShowNewDir := False; - SenderThread.FSigDialogNewDir := True; - end; - if SenderThread.FDialogShowMsgBox then begin - SenderThread.FDialogResultMsgBox := Application.MessageBox(SenderThread.FMsgBoxText, SenderThread.FMsgBoxButtons, - SenderThread.FMsgBoxStyle, SenderThread.FMsgBoxDefault, - SenderThread.FMsgBoxEscape); - SenderThread.FDialogShowMsgBox := False; - SenderThread.FSigDialogMsgBox := True; + if SenderThread.FDialogShowMsgBox then begin + SenderThread.FDialogResultMsgBox := Application.MessageBox(SenderThread.FMsgBoxText, SenderThread.FMsgBoxButtons, + SenderThread.FMsgBoxStyle, SenderThread.FMsgBoxDefault, + SenderThread.FMsgBoxEscape); + SenderThread.FDialogShowMsgBox := False; + b := True; + end; + finally + // Unlock the waiting worker thread + if b then begin + b := False; + SenderThread.FCallbackLockEvent.SetEvent; + end; end; - finally end; end; if SenderThread.FShowCancelMessage then if SenderThread.FCancelMessage = LANGUserCancelled @@ -2179,6 +2188,7 @@ begin inherited Create(True); FreeOnTerminate := False; GUIMutex := TCriticalSection.Create; + FCallbackLockEvent := TSimpleEvent.Create; FCancelled := False; ProgressForm := nil; Engine := nil; @@ -2190,12 +2200,8 @@ begin FShowCancelMessage := False; FDialogShowDirDelete := False; FDialogShowOverwrite := False; - FSigDialogDirDelete := False; - FSigDialogOverwrite := False; FDialogShowNewDir := False; - FSigDialogNewDir := False; FDialogShowMsgBox := False; - FSigDialogMsgBox := False; ExtractFromVFSMode := False; ErrorHappened := False; ParamBool1 := False; @@ -2209,6 +2215,7 @@ end; destructor TWorkerThread.Destroy; begin GUIMutex.Free; + FCallbackLockEvent.Free; inherited Destroy; end; @@ -2286,10 +2293,7 @@ begin if DirDeleteCaption = '' then FDirDeleteCaption := LANGRemoveDirectory else FDirDeleteCaption := DirDeleteCaption; FDialogShowDirDelete := True; - repeat - Sleep(ConstInternalProgressTimer); - until FSigDialogDirDelete; - FSigDialogDirDelete := False; + FCallbackLockEvent.WaitFor(INFINITE); Result := FDialogResultDirDelete; end; @@ -2305,10 +2309,7 @@ begin FOverwriteSourceFile := SourceFile; FOverwriteDestFile := DestFile; FDialogShowOverwrite := True; - repeat - Sleep(ConstInternalProgressTimer); - until FSigDialogOverwrite; - FSigDialogOverwrite := False; + FCallbackLockEvent.WaitFor(INFINITE); Result := FDialogResultOverwrite; end; @@ -2318,10 +2319,7 @@ begin FNewDirLabel := LabelCaption; FNewDirEdit := Edit; FDialogShowNewDir := True; - repeat - Sleep(ConstInternalProgressTimer); - until FSigDialogNewDir; - FSigDialogNewDir := False; + FCallbackLockEvent.WaitFor(INFINITE); Result := FDialogResultNewDir; end; @@ -2333,10 +2331,7 @@ begin FMsgBoxDefault := Default; FMsgBoxEscape := Escape; FDialogShowMsgBox := True; - repeat - Sleep(ConstInternalProgressTimer); - until FSigDialogMsgBox; - FSigDialogMsgBox := False; + FCallbackLockEvent.WaitFor(INFINITE); Result := FDialogResultMsgBox; end; |
