summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2008-10-12 12:59:11 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2008-10-12 12:59:11 +0200
commitb417ac914af5e3dfeb27eb5bde6210f88c5b9ec4 (patch)
tree90465a73012a3dbfece26d29de3d1224a0ae0425
parent928e2dc79b46a455ef0c0096ddf40682e07b4a27 (diff)
downloadtuxcmd-b417ac914af5e3dfeb27eb5bde6210f88c5b9ec4.tar.xz
Change active waiting to standard thread synchronization mechanism (semaphors-like)
-rw-r--r--UCore.pas167
1 files changed, 81 insertions, 86 deletions
diff --git a/UCore.pas b/UCore.pas
index 5770ef7..cdbbd06 100644
--- a/UCore.pas
+++ b/UCore.pas
@@ -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;