From 4cdfa1d463b2f33436aea8f1ca8a4f75f5938ddf Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 13 Dec 2009 20:20:55 +0100 Subject: Consolidate ProcessProgressThread, make it more universal --- UCoreWorkers.pas | 378 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 197 insertions(+), 181 deletions(-) (limited to 'UCoreWorkers.pas') diff --git a/UCoreWorkers.pas b/UCoreWorkers.pas index 72dd60f..757afca 100644 --- a/UCoreWorkers.pas +++ b/UCoreWorkers.pas @@ -20,15 +20,18 @@ unit UCoreWorkers; interface -uses glib2, gtk2, SyncObjs, Classes, GTKForms, GTKView, ULibc, UEngines, UCoreUtils, UProgress, UVFSCore, uVFSprototypes, UCore; +uses glib2, gtk2, SyncObjs, Classes, GTKForms, GTKView, ULibc, UEngines, UCoreUtils, UVFSCore, uVFSprototypes, UCore; type TVFSCallbackThread = class(TThread) private FThreadID: __pthread_t; FCopyProgressFunc: TEngineProgressFunc; + Finished: boolean; // * TODO: move to Create() ? procedure PrepareExecute; // Call this right after thread has been started public + FCancelled: boolean; + AEngine: TPanelEngine; APlugin: TVFSPlugin; @@ -55,10 +58,11 @@ type TVFSCallbackThread = class(TThread) VFSConnectionManagerMode: boolean; VFSQuickConnectMode: boolean; - VFSDialogsParentWindow: PGtkWidget; FCancelRequested: boolean; + DialogsParentWindow: TCustomGTKForm; + constructor Create(CreateSuspended: boolean); destructor Destroy; override; end; @@ -70,8 +74,6 @@ type TVFSCallbackThread = class(TThread) procedure Execute; override; procedure CommitGUIUpdate; public - FCancelled: boolean; - // Data to update FProgress1Pos, FProgress2Pos, FProgress1Max, FProgress2Max: Int64; FProgress1Text, FProgress2Text, FLabel1Text, FLabel2Text: string; @@ -80,7 +82,7 @@ type TVFSCallbackThread = class(TThread) FGUIChanged: boolean; FCancelMessage: string; - FDoneThread, FShowCancelMessage, + FShowCancelMessage, FDialogShowDirDelete, FDialogShowOverwrite, FDialogShowNewDir, FDialogShowMsgBox: boolean; FDialogResultDirDelete, FDialogResultOverwrite, FDialogResultNewDir: integer; @@ -101,7 +103,6 @@ type TVFSCallbackThread = class(TThread) FCallbackLockEvent: TSimpleEvent; // Parameters - ProgressForm: TFProgress; Engine, SrcEngine, DestEngine: TPanelEngine; LeftPanel: boolean; DataList: TList; @@ -121,8 +122,6 @@ type TVFSCallbackThread = class(TThread) constructor Create; destructor Destroy; override; - procedure CancelIt; - function Cancelled: boolean; procedure PrepareJobFilesFromPanel(AList: TList; DoNotRecurse: boolean); @@ -152,7 +151,6 @@ type TVFSCallbackThread = class(TThread) ASelItem: string; AAutoFallBack: boolean; ADirList: TList; - Finished, CancelIt: boolean; RunningTime: Int64; AFullPath, AHighlightItem: string; ChDirResult, ListingResult, VFSOpenResult: boolean; @@ -167,7 +165,6 @@ type TVFSCallbackThread = class(TThread) procedure Execute; override; public URI: string; - Finished: boolean; OpenResult: boolean; OpenError: PGError; constructor Create; @@ -185,13 +182,14 @@ procedure ChownFilesWorker(SenderThread: TWorkerThread); procedure DummyThreadWorker(SenderThread: TWorkerThread); // Worker threads utilities -procedure ProcessProgressThread(SenderThread: TWorkerThread; ProgressForm: TFProgress); +// These should be called from main thread +procedure ProcessThreadEvents(SenderThread: TVFSCallbackThread); implementation uses SysUtils, DateUtils, StrUtils, UConfig, UDirDelete, UOverwrite, ULocale, - UFileAssoc, UCoreClasses, URemoteWait, UMain, UGnome, UNewDir, + UFileAssoc, UCoreClasses, URemoteWait, UMain, UGnome, UNewDir, UProgress, crc; @@ -206,8 +204,10 @@ begin VFSCallbackCancelled := False; VFSConnectionManagerMode := False; VFSQuickConnectMode := False; - VFSDialogsParentWindow := FMain.FWidget; + DialogsParentWindow := FMain; FCancelRequested := False; + Finished := False; + FCancelled := False; end; destructor TVFSCallbackThread.Destroy; @@ -239,7 +239,7 @@ begin end; if pthread_self = Application.ThreadID then begin DebugMsg(['!! (WARNING): vfs_ask_question_callback called from the main thread, expected spawn from a TVFSCallbackThread']); - HandleVFSAskQuestionCallback(Thread.VFSDialogsParentWindow, AMessage, Choices, choice); + HandleVFSAskQuestionCallback(Thread.DialogsParentWindow.FWidget, AMessage, Choices, choice); if (choice <> nil) then Thread.VFSCallbackCancelled := (choice^ < 0) or (choice^ = cancel_choice); Exit; end; @@ -310,7 +310,7 @@ begin // Ask for password if pthread_self = Application.ThreadID then begin DebugMsg(['!! (WARNING): vfs_ask_password_callback called from the main thread, expected spawn from a TVFSCallbackThread']); - Result := HandleVFSAskPasswordCallback(Thread.VFSDialogsParentWindow, AMessage, default_user, default_domain, def_pass, flags, username, password, anonymous, domain, password_save); + Result := HandleVFSAskPasswordCallback(Thread.DialogsParentWindow.FWidget, AMessage, default_user, default_domain, def_pass, flags, username, password, anonymous, domain, password_save); Thread.VFSCallbackCancelled := Result = False; end else if pthread_self = Thread.FThreadID then begin @@ -371,7 +371,12 @@ end; procedure TWorkerThread.Execute; begin PrepareExecute; - if Assigned(WorkerProcedure) then WorkerProcedure(Self); + try + if Assigned(WorkerProcedure) then + WorkerProcedure(Self); + finally + Finished := True; + end; end; constructor TWorkerThread.Create; @@ -380,14 +385,11 @@ begin FreeOnTerminate := False; GUIMutex := TCriticalSection.Create; FCallbackLockEvent := TSimpleEvent.Create; - FCancelled := False; - ProgressForm := nil; Engine := nil; DataList := nil; ParamPointer1 := nil; WorkerProcedure := nil; SelectedItem := nil; - FDoneThread := False; FShowCancelMessage := False; FDialogShowDirDelete := False; FDialogShowOverwrite := False; @@ -410,16 +412,6 @@ begin inherited Destroy; end; -procedure TWorkerThread.CancelIt; -begin - FCancelled := True; -end; - -function TWorkerThread.Cancelled: boolean; -begin - Result := FCancelled or ProgressForm.Cancelled; -end; - procedure TWorkerThread.UpdateProgress1(const Progress: Int64; const ProgressText: string); begin // DebugMsg([' ** TWorkerThread.UpdateProgress1(Progress = ', Progress, ', ProgressText = ', ProgressText]); @@ -556,71 +548,91 @@ end; (********************************************************************************************************************************) (********************************************************************************************************************************) -procedure ProcessProgressThread(SenderThread: TWorkerThread; ProgressForm: TFProgress); +procedure ProcessThreadEvents(SenderThread: TVFSCallbackThread); var AFDirDelete: TFDirDelete; AFOverwrite: TFOverwrite; AFNewDir: TFNewDir; - b: boolean; + AFProgress: TFProgress; + AFRemoteWait: TFRemoteWait; + ParentDialogForm: TCustomGTKForm; + b, ShowRemoteWait: boolean; + StartTime: TDateTime; begin - DebugMsg([' ** ProcessProgressThread --begin']); - b := False; - try - while not SenderThread.FDoneThread do begin -// Write('.'); + DebugMsg([' ** ProcessThreadEvents --begin']); + ShowRemoteWait := False; + AFProgress := nil; + AFRemoteWait := nil; + ParentDialogForm := SenderThread.DialogsParentWindow; + StartTime := Now; + + if SenderThread is TWorkerThread then begin + AFProgress := TFProgress.Create(SenderThread.DialogsParentWindow); + ParentDialogForm := AFProgress; + // * TODO + AFProgress.Label1.Caption := LANGCopySC; + // * TODO + AFProgress.SetNumBars(True); + AFProgress.ProgressBar.Fraction := 0; + AFProgress.ProgressBar2.Fraction := 0; + AFProgress.ShowModal; + end else + if SenderThread is TOpenDirThread then begin + AFRemoteWait := TFRemoteWait.Create(SenderThread.DialogsParentWindow); + end; + + repeat + b := False; + // * TODO: transform to GMainLoop Sleep(ConstInternalProgressTimer); -// DebugMsg([' ** ProcessProgressThread: updating UI (FProgress1Pos = ', SenderThread.FProgress1Pos, ', FProgress2Pos = ', SenderThread.FProgress2Pos]); + // Check for cancellation + if ((AFProgress <> nil) and AFProgress.Cancelled) or ((AFRemoteWait <> nil) and AFRemoteWait.Cancelled) then + SenderThread.FCancelled := True; -// DebugMsg(['ProcessProgressThread - before mutex']); - SenderThread.GUIMutex.Acquire; -// WriteLn('ProcessProgressThread - ted mam lock ja! -- enter'); + // Display busy wait dialog after timeout for some operations + if (AFRemoteWait <> nil) and (not ShowRemoteWait) and (MilliSecondsBetween(StartTime, Now) >= ConstRemoteWaitDialogDelay) then begin + AFRemoteWait.ShowModal; + ShowRemoteWait := True; + ParentDialogForm := AFRemoteWait; + end; - try - if SenderThread.FGUIChanged then begin - if SenderThread.FGUIProgress1Max > 1 - then ProgressForm.ProgressBar.Fraction := SenderThread.FGUIProgress1Pos / SenderThread.FGUIProgress1Max - else ProgressForm.ProgressBar.Fraction := 0; -// ProgressForm.ProgressBar.Value := SenderThread.FGUIProgress1Pos; - ProgressForm.ProgressBar.Text := SenderThread.FGUIProgress1Text; - ProgressForm.Label2.Caption := SenderThread.FGUILabel1Text; - if ProgressForm.FTwoBars then begin - if SenderThread.FGUIProgress2Max > 1 - then ProgressForm.ProgressBar2.Fraction := SenderThread.FGUIProgress2Pos / SenderThread.FGUIProgress2Max - else ProgressForm.ProgressBar2.Fraction := 0; -// ProgressForm.ProgressBar2.Value := SenderThread.FGUIProgress2Pos; - ProgressForm.ProgressBar2.Text := SenderThread.FGUIProgress2Text; - ProgressForm.Label3.Caption := SenderThread.FGUILabel2Text; + // Update progress bars + if SenderThread is TWorkerThread then + with SenderThread as TWorkerThread do begin + GUIMutex.Acquire; + if FGUIChanged then begin + if FGUIProgress1Max > 1 + then AFProgress.ProgressBar.Fraction := FGUIProgress1Pos / FGUIProgress1Max + else AFProgress.ProgressBar.Fraction := 0; + AFProgress.ProgressBar.Text := FGUIProgress1Text; + AFProgress.Label2.Caption := FGUILabel1Text; + if AFProgress.FTwoBars then begin + if FGUIProgress2Max > 1 + then AFProgress.ProgressBar2.Fraction := FGUIProgress2Pos / FGUIProgress2Max + else AFProgress.ProgressBar2.Fraction := 0; + AFProgress.ProgressBar2.Text := FGUIProgress2Text; + AFProgress.Label3.Caption := FGUILabel2Text; + end; + AFProgress.ProgressBar.Max := FGUIProgress1Max; + AFProgress.ProgressBar2.Max := FGUIProgress2Max; + FGUIChanged := False; end; - ProgressForm.ProgressBar.Max := SenderThread.FGUIProgress1Max; - ProgressForm.ProgressBar2.Max := SenderThread.FGUIProgress2Max; - SenderThread.FGUIChanged := False; + GUIMutex.Release; end; - except - on E: Exception do DebugMsg(['*** Exception raised in UCore.ProcessProgressThread::updating progress bars block (', E.ClassName, '): ', E.Message]); - end; - - -// Sleep(1000); -// WriteLn('ProcessProgressThread - ted mam lock ja! -- leave'); - SenderThread.GUIMutex.Release; - -// DebugMsg(['Before refresh']); Application.ProcessMessages; -// DebugMsg(['After refresh']); - // VFS callbacks if SenderThread.VFSAskQuestion_Display then begin SenderThread.VFSAskQuestion_Display := False; DebugMsg(['ProcessProgressThread - Main thread: displaying question dialog']); - HandleVFSAskQuestionCallback(ProgressForm.FWidget, SenderThread.VFSAskQuestion_Message, SenderThread.VFSAskQuestion_Choices, SenderThread.VFSAskQuestion_Choice); + HandleVFSAskQuestionCallback(ParentDialogForm.FWidget, SenderThread.VFSAskQuestion_Message, SenderThread.VFSAskQuestion_Choices, SenderThread.VFSAskQuestion_Choice); SenderThread.VFSCallbackEvent.SetEvent; end; if SenderThread.VFSAskPassword_Display then begin SenderThread.VFSAskPassword_Display := False; DebugMsg(['ProcessProgressThread - Main thread: displaying password prompt']); - SenderThread.VFSAskPassword_Result := HandleVFSAskPasswordCallback(ProgressForm.FWidget, + SenderThread.VFSAskPassword_Result := HandleVFSAskPasswordCallback(ParentDialogForm.FWidget, SenderThread.VFSAskPassword_Message, SenderThread.VFSAskPassword_default_user, SenderThread.VFSAskPassword_default_domain, @@ -634,93 +646,108 @@ begin SenderThread.VFSCallbackEvent.SetEvent; end; + Application.ProcessMessages; - 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; - end; - SenderThread.FDialogShowDirDelete := False; - b := True; - end; - if SenderThread.FDialogShowOverwrite then begin - AFOverwrite := nil; + // DirDelete dialogs + if SenderThread is TWorkerThread then + with SenderThread as TWorkerThread do 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; + if FDialogShowDirDelete then begin + AFDirDelete := nil; + try + AFDirDelete := TFDirDelete.Create(ParentDialogForm); + AFDirDelete.Caption := FDirDeleteCaption; + AFDirDelete.AddButtons(FDirDeleteButtonsType); + AFDirDelete.Label1.Caption := FDirDeleteLabel1Text; + AFDirDelete.Label2.Caption := FDirDeleteLabel2Text; + AFDirDelete.Label3.Caption := FDirDeleteLabel3Text; + AFDirDelete.Label2.Visible := FDirDeleteLabel2Visible; + AFDirDelete.Label3.Visible := FDirDeleteLabel3Visible; + FDialogResultDirDelete := Integer(AFDirDelete.Run); + if (FDirDeleteButtonsType = 3) and (FDialogResultDirDelete = 2) and (not ParamBool3) + then case Application.MessageBox(LANGIgnoreError, [mbYes, mbNo{, mbCancel}], mbWarning, mbYes, mbNo) of + mbNo: FDialogResultDirDelete := 1; + mbCancel: FDialogResultDirDelete := 0; + end; + finally + AFDirDelete.Free; + end; + FDialogShowDirDelete := False; + b := 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; + if FDialogShowOverwrite then begin + AFOverwrite := nil; + try + AFOverwrite := TFOverwrite.Create(ParentDialogForm); + AFOverwrite.AddButtons(FOverwriteButtonsType); + AFOverwrite.FromLabel.Caption := FOverwriteFromLabel; + AFOverwrite.FromInfoLabel.Caption := FOverwriteFromInfoLabel; + AFOverwrite.ToLabel.Caption := FOverwriteToLabel; + AFOverwrite.ToInfoLabel.Caption := FOverwriteToInfoLabel; + AFOverwrite.RenameStr := FOverwriteRenameStr; + AFOverwrite.SourceFile := FOverwriteSourceFile; + AFOverwrite.DestFile := FOverwriteDestFile; + FDialogResultOverwrite := Integer(AFOverwrite.Run); + FOverwriteRenameStr := UTF8ToStr(AFOverwrite.RenameStr); + finally + AFOverwrite.Free; + end; + FDialogShowOverwrite := False; + b := True; + end; + + if FDialogShowNewDir then begin + AFNewDir := nil; + try + AFNewDir := TFNewDir.Create(ParentDialogForm); + AFNewDir.Caption := FNewDirCaption; + AFNewDir.Label1.Caption := FNewDirLabel; + AFNewDir.Entry.Text := FNewDirEdit; + AFNewDir.Entry.SelectAll; + FDialogResultNewDir := Integer(AFNewDir.Run); + FNewDirEdit := AFNewDir.Entry.Text; + finally + AFNewDir.Free; + end; + FDialogShowNewDir := False; + b := True; + end; + + if FDialogShowMsgBox then begin + FDialogResultMsgBox := Application.MessageBox(PGtkWindow(ParentDialogForm.FWidget), + FMsgBoxText, FMsgBoxButtons, + FMsgBoxStyle, FMsgBoxDefault, + FMsgBoxEscape); + FDialogShowMsgBox := False; + b := True; + end; finally - AFNewDir.Free; + // Unlock the waiting worker thread + if b then FCallbackLockEvent.SetEvent; end; - SenderThread.FDialogShowNewDir := False; - b := True; + until SenderThread.Finished; + + if SenderThread is TWorkerThread then + with SenderThread as TWorkerThread do + if FShowCancelMessage then begin + if FCancelMessage = LANGUserCancelled + then Application.MessageBox(FCancelMessage, [mbOK], mbWarning, mbNone, mbOK) + else Application.MessageBox(FCancelMessage, [mbOK], mbError, mbNone, mbOK); end; - 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; + // Close all dialogs + if AFProgress <> nil then begin + AFProgress.Close; + AFProgress.Free; end; - if SenderThread.FShowCancelMessage then - if SenderThread.FCancelMessage = LANGUserCancelled - then Application.MessageBox(SenderThread.FCancelMessage, [mbOK], mbWarning, mbNone, mbOK) - else Application.MessageBox(SenderThread.FCancelMessage, [mbOK], mbError, mbNone, mbOK); - except - on E: Exception do DebugMsg(['*** Exception raised in UCore.ProcessProgressThread (', E.ClassName, '): ', E.Message]); + if AFRemoteWait <> nil then begin + AFRemoteWait.Close; + AFRemoteWait.Free; end; - DebugMsg([' ** ProcessProgressThread --end']); + + DebugMsg([' ** ProcessThreadEvents --end']); end; @@ -791,7 +818,7 @@ begin if AList.Count = 1 then Fr := 1 else Fr := 100 / (AList.Count - 1); if AList.Count > 0 then for i := 0 to AList.Count - 1 do begin - if Cancelled then begin + if FCancelled then begin FCancelMessage := LANGUserCancelled; FShowCancelMessage := True; Break; @@ -830,7 +857,6 @@ begin if not Engine.ChangeDir(CurrPath, nil) then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour might occur.']); end; - SenderThread.FDoneThread := True; end; @@ -850,7 +876,7 @@ end; if BytesDone = 0 then UpdateProgress1(0, '0%') else UpdateProgress1(BytesDone, Format('%d%%', [Round(ParamFloat2 * BytesDone)])); UpdateProgress2(ParamInt64 + BytesDone, Format('%d%%', [Round(ParamFloat1 * (ParamInt64 + BytesDone))])); - Result := not Cancelled; + Result := not FCancelled; CommitGUIUpdate; end else DebugMsg(['*** CopyFilesWorker: Sender is not TWorkerThread']); except @@ -870,7 +896,7 @@ end; end; case ErrorType of 0 : begin - CancelIt; + FCancelled := True; Exit; end; 1 : s := LANGMemoryAllocationFailed; @@ -890,7 +916,7 @@ end; case ShowDirDeleteDialog(3, s, s3, 'ahoj' { GetErrorString(ErrorNum)} , s2) of 0, 252 : begin // Cancel button, Escape Result := False; - CancelIt; + FCancelled := True; end; 2 : Result := True; // Ignore 3 : begin // Skip All @@ -1130,7 +1156,7 @@ var DefResponse: integer; // Global variables for this function DestEngine.Chmod(Dst, DataItem^.Mode, nil); DestEngine.Chown(Dst, DataItem^.UID, DataItem^.GID, nil); DestEngine.ChangeTimes(Dst, DataItem^.mtime, DataItem^.atime, nil); - if not Cancelled then begin + if not FCancelled then begin ErrorKind := Ord(SrcEngine.Remove(String(DataItem^.FName), nil)); // if ErrorKind <> 0 then Result := ERRRemove; end; @@ -1366,7 +1392,6 @@ begin List.Clear; with SenderThread do begin ErrorHappened := False; - FCancelled := False; SaveSrcPath := ''; CurrPath := IncludeTrailingPathDelimiter(SrcEngine.Path); SaveDestPath := DestEngine.Path; @@ -1474,7 +1499,7 @@ begin end; if (not PDataItemSL(List[i])^.DataItem^.IsDir) and (not PDataItemSL(List[i])^.DataItem^.IsLnk) then Inc(ParamInt64, PDataItemSL(List[i])^.DataItem^.Size); - if Cancelled then begin + if FCancelled then begin FCancelMessage := LANGUserCancelled; FShowCancelMessage := True; ErrorHappened := True; @@ -1502,7 +1527,6 @@ begin if not SrcEngine.ChangeDir(CurrPath, nil) then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour might occur.']); end; - SenderThread.FDoneThread := True; DebugMsg(['(II) CopyFilesWorker: finished']); end; @@ -1570,7 +1594,7 @@ var FD: TEngineFileDes; Inc(SizeDone, Count); if ParamBool1 then UpdateProgress2(SizeDone, Format('%d %%', [Trunc(SizeDone / FProgress2Max * 100)])); CommitGUIUpdate; - until (Count < MergeBlockSize) or Cancelled; + until (Count < MergeBlockSize) or FCancelled; // * TODO: set real error, also free it Engine.CloseFile(FDR, nil); end; @@ -1655,14 +1679,14 @@ begin except CurrFile := ''; end; - until (SizeDone = ParamInt64) or Cancelled or PrivateCancel {or ((not b) and (not HasInitialCRC))} or (CurrFile = ''); + until (SizeDone = ParamInt64) or FCancelled or PrivateCancel {or ((not b) and (not HasInitialCRC))} or (CurrFile = ''); // * TODO: check error if (not ParamBool1) and HasFinalCRC then Engine.RenameFile(TargetName, IncludeTrailingPathDelimiter(ExtractFilePath(TargetName)) + TargetFinalName, nil); - if Cancelled and (not PrivateCancel) then begin + if FCancelled and (not PrivateCancel) then begin FCancelMessage := LANGUserCancelled; FShowCancelMessage := True; end; - if not (Cancelled or PrivateCancel) then + if not (FCancelled or PrivateCancel) then if HasFinalCRC then begin if CurrentCRC = ParamLongWord1 then ShowMessageBox(Format(LANGMergeOfSSucceeded, [StrToUTF8(ExtractFileName(TargetFinalName))]), [mbOK], mbInfo, mbNone, mbOK) @@ -1672,7 +1696,6 @@ begin Engine.CloseFile(FD, nil); end; libc_free(Buffer); - SenderThread.FDoneThread := True; end; @@ -1742,7 +1765,7 @@ var FD: TEngineFileDes; UpdateProgress1(FProgress1Pos + wCount, Format('%d %%', [Trunc((FProgress1Pos + wCount) / FProgress1Max * 100)])); if ParamInt64 > 0 then UpdateProgress2(FProgress2Pos + wCount, Format('%d %%', [Trunc((FProgress2Pos + wCount) / FProgress2Max * 100)])); CommitGUIUpdate; - until (Written = PartSize) or Cancelled or PrivateCancel; + until (Written = PartSize) or FCancelled or PrivateCancel; // * TODO: set real error, also free it Engine.CloseFile(FDW, nil); end; @@ -1905,17 +1928,17 @@ begin except FileName := ''; end; - until (SizeDone = FileSize) or Cancelled or PrivateCancel or (FileName = ''); - if Cancelled and (not PrivateCancel) then begin + until (SizeDone = FileSize) or FCancelled or PrivateCancel or (FileName = ''); + if FCancelled and (not PrivateCancel) then begin FCancelMessage := LANGUserCancelled; FShowCancelMessage := True; end; - if not (Cancelled or PrivateCancel) then begin + if not (FCancelled or PrivateCancel) then begin repeat Engine.GetFileSystemInfo(FilePath, x, TDF, xx); if (TDF < 512) and (not NewDiskQuestion) then Break; - until (TDF >= 512) or PrivateCancel or Cancelled; - if WriteCRCFile(ProgressForm, Engine, IncludeTrailingPathDelimiter(FilePath) + FileName, OriginalFName, SizeDone, FileCRC) + until (TDF >= 512) or PrivateCancel or FCancelled; + if WriteCRCFile(SenderThread.DialogsParentWindow, Engine, IncludeTrailingPathDelimiter(FilePath) + FileName, OriginalFName, SizeDone, FileCRC) then ShowMessageBox(Format(LANGSplitOfSSucceeded, [StrToUTF8(OriginalFName)]), [mbOK], mbInfo, mbNone, mbOK) else begin FCancelMessage := Format(LANGSplitOfSFailed, [StrToUTF8(OriginalFName)]); @@ -1929,7 +1952,6 @@ begin for i := List.Count - 1 downto 0 do FreeDataItem(PDataItem(List[i])); List.Free; - SenderThread.FDoneThread := True; end; @@ -1994,7 +2016,7 @@ begin if AList.Count = 1 then Fr := 1 else Fr := 100 / (AList.Count - 1); if AList.Count > 0 then for i := 0 to AList.Count - 1 do begin - if Cancelled then begin + if FCancelled then begin FCancelMessage := LANGUserCancelled; FShowCancelMessage := True; Break; @@ -2012,7 +2034,6 @@ begin AList.Clear; AList.Free; end; - SenderThread.FDoneThread := True; end; @@ -2075,7 +2096,7 @@ begin if AList.Count = 1 then Fr := 1 else Fr := 100 / (AList.Count - 1); if AList.Count > 0 then for i := 0 to AList.Count - 1 do begin - if Cancelled then begin + if FCancelled then begin FCancelMessage := LANGUserCancelled; FShowCancelMessage := True; Break; @@ -2093,7 +2114,6 @@ begin AList.Clear; AList.Free; end; - SenderThread.FDoneThread := True; end; @@ -2119,11 +2139,10 @@ begin UpdateProgress2(101-i, Format('%d%%', [101-i])); UpdateCaption2(Format('Test %d test', [101-i])); CommitGUIUpdate; - if Cancelled then Break; + if FCancelled then Break; end; end; DebugMsg(['(II) DummyThreadWorker: finish']); - SenderThread.FDoneThread := True; end; @@ -2135,8 +2154,6 @@ constructor TOpenDirThread.Create; begin inherited Create(True); FreeOnTerminate := False; - Finished := False; - CancelIt := False; ChDirResult := False; ListingResult := False; VFSOpenResult := False; @@ -2223,9 +2240,9 @@ begin VFSOpenResult := (AEngine as TVFSEngine).VFSOpenEx(AFullPath, @vfs_ask_question_callback, @vfs_ask_password_callback, nil, Self, @VFSOpenError); end else VFSOpenResult := True; - if VFSOpenResult and (not CancelIt) then begin + if VFSOpenResult and (not FCancelled) then begin ChDirResult := ChangeDir(AEngine, APath, ASelItem, AAutoFallBack); - if ChDirResult and (not CancelIt) then + if ChDirResult and (not FCancelled) then ListingResult := AEngine.GetListing(ADirList, AEngine.GetPath, ConfShowDotFiles, True, False, @ListingError); end; except @@ -2246,7 +2263,6 @@ constructor TOpenConnectionThread.Create; begin inherited Create(True); FreeOnTerminate := False; - Finished := False; OpenResult := False; OpenError := nil; end; -- cgit v1.2.3