Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Sicherstellen das Procedure abgearbeitet wurde (https://www.delphipraxis.net/201927-sicherstellen-das-procedure-abgearbeitet-wurde.html)

Int3g3r 11. Sep 2019 08:56

Sicherstellen das Procedure abgearbeitet wurde
 
Guten Tag,

Ich komme immer wieder an eine Stelle an der ich sichergehen muss das Block1 vor Block2 ausgeführt wird.
Block1 kann je nach Datenmenge zwischen 0.1s und 10s dauern. Der Benutzer erhält so oder so die Meldung "Bitte warten..".
Der Benutzer kann während dieser Zeit nicht mit dem Programm arbeiten. Mir ist klar das dies nicht die sauberste Lösung ist.
Da ich mich noch nicht mit Threads beschäftigt habe wäre mir ein Beispiel ohne Threads sehr willkomen.

Wie kann ich am Punkt "warten" sicherstellen das Block1 abgearbeitet wurde ?
Ich hatte nun schon mehrmals das Problem das Block2 ausgeführt wurde und Block1 noch nicht mit seiner Arbeit fertig war.
Was in einer Exception endet.

Delphi-Quellcode:
Procedure Block1
begin
  // mach was..
end;

//warten.. sicherstellen das Block1 fertig ist

Procedure Block2
begin
  // mach was.. aber Block1 muss abgearbeitet sein.
end;

mkinzler 11. Sep 2019 09:01

AW: Sicherstellen das Procedure abgearbeitet wurde
 
Ohne Threads wäre das sogar einfacher. Wenn alles im Hauptthread abläuft wartet dieser auf Abschluss:

Delphi-Quellcode:
Block1;
Block2;

DeddyH 11. Sep 2019 09:06

AW: Sicherstellen das Procedure abgearbeitet wurde
 
Bist Du sicher, dass Du keine asynchrone Verarbeitung in Deinem Programm hast? Ansonsten wird bei Aufruf von
Delphi-Quellcode:
Block1;
Block2;
immer Block1 vollständig ausgeführt, bevor es an Block2 geht.

Andreas13 11. Sep 2019 09:11

AW: Sicherstellen das Procedure abgearbeitet wurde
 
Hallo Int3g3r,
z.B. so:
Delphi-Quellcode:
Function Block1: Boolean;
begin
  Block1:= False;
  // mach was..
  ...
  Block1:= True;
end;

Procedure Block2
begin
  // mach was.. aber Block1 muss abgearbeitet sein.
end;
...

//warten.. sicherstellen daß Block1 fertig ist
MassageBox('Bitte warten etc.');

IF Block1 Then Block2;
Gruß, Andreas

Int3g3r 11. Sep 2019 09:24

AW: Sicherstellen das Procedure abgearbeitet wurde
 
Zitat:

Zitat von DeddyH (Beitrag 1445647)
Bist Du sicher, dass Du keine asynchrone Verarbeitung in Deinem Programm hast? Ansonsten wird bei Aufruf von
Delphi-Quellcode:
Block1;
Block2;
immer Block1 vollständig ausgeführt, bevor es an Block2 geht.

Das ist eben mein knackpunkt. Ich weis es nicht ob eine asynchrone Verarbeitung stattfindet.

Delphi-Quellcode:
Procedure Block3
begin
  DelFilesFromDir;
  CopyFileInDirecory;
end;

procedure DelFilesFromDir(Directory, FileMask: string; DelSubDirs: Boolean);
var
   SourceLst: string;
  FOS: TSHFileOpStruct;
begin
  FillChar(FOS, SizeOf(FOS), 0);
  FOS.Wnd := Application.MainForm.Handle;
   FOS.wFunc := FO_DELETE;
   SourceLst := Directory + '\' + FileMask + #0;
  FOS.pFrom := PChar(SourceLst);
  if not DelSubDirs then
      FOS.fFlags := FOS.fFlags OR FOF_FILESONLY;
   // Remove the next line if you want a confirmation dialog box
   FOS.fFlags := FOS.fFlags OR FOF_NOCONFIRMATION;
   // Uncomment the next line for a "silent operation" (no progress box)
   // FOS.fFlags := FOS.fFlags OR FOF_SILENT;
   SHFileOperation(FOS);
end;
Ich bin mir hier einfach nicht sicher.
Da meist im hintergrund noch so viel abläuft auf was ich keinen direkten einfluss habe.

Also ist hier auch sichergestellt das "DelFilesFromDir" ausgeführt und beendet wurde bevor "CopyFileInDirecory" ausgeführt wird? Auch Wenn das Löschen 10s in anspruch nimmt ?

Besten Dank für die Hilfe!

mkinzler 11. Sep 2019 09:45

AW: Sicherstellen das Procedure abgearbeitet wurde
 
Zitat:

Das ist eben mein knackpunkt. Ich weis es nicht ob eine asynchrone Verarbeitung stattfindet.
Wenn Du nicht selber dafür sorgst, dass die Verarbeitung asynchron abläuft (Ausführung in einem Hintergrundthread) läuft diese garantriert synchron.

KodeZwerg 11. Sep 2019 13:32

AW: Sicherstellen das Procedure abgearbeitet wurde
 
hi, ich bin der meinung das
Code:
SHFileOperation(FOS);
hier ein mini problem darstellt.
mit
Code:
eineLeereVariable := SHFileOperation(FOS);
sollte das problem gefixt sein. hoffe ich...

TurboMagic 11. Sep 2019 22:15

AW: Sicherstellen das Procedure abgearbeitet wurde
 
Zitat:

Zitat von Andreas13 (Beitrag 1445648)
Hallo Int3g3r,
z.B. so:
Delphi-Quellcode:
Function Block1: Boolean;
begin
  Block1:= False;
  // mach was..
  ...
  Block1:= True;
end;

Procedure Block2
begin
  // mach was.. aber Block1 muss abgearbeitet sein.
end;
...

//warten.. sicherstellen daß Block1 fertig ist
MassageBox('Bitte warten etc.');

IF Block1 Then Block2;
Gruß, Andreas

Hinweis: die Nutzung des Funktionsnamens zur Rückkage des Rückgabewertes der Funktion ist in Delphi
heutzutage nicht mehr üblich. Man würde es result zuweisen: result := false; usw.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz