summaryrefslogtreecommitdiff
path: root/UCoreWorkers.pas
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2009-12-13 20:20:55 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2009-12-13 20:20:55 +0100
commit4cdfa1d463b2f33436aea8f1ca8a4f75f5938ddf (patch)
tree967c1f615854984b9b0dd4ffa8ca28f73b603f5a /UCoreWorkers.pas
parent0f7616a007edaa1d19c4672a4fd390c072b1eba6 (diff)
downloadtuxcmd-4cdfa1d463b2f33436aea8f1ca8a4f75f5938ddf.tar.xz
Consolidate ProcessProgressThread, make it more universal
Diffstat (limited to 'UCoreWorkers.pas')
-rw-r--r--UCoreWorkers.pas378
1 files changed, 197 insertions, 181 deletions
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;