AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Sicherstellen das Procedure abgearbeitet wurde

Ein Thema von Int3g3r · begonnen am 11. Sep 2019 · letzter Beitrag vom 11. Sep 2019
Antwort Antwort
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
77 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 07:56
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.434 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 08:01
Ohne Threads wäre das sogar einfacher. Wenn alles im Hauptthread abläuft wartet dieser auf Abschluss:

Delphi-Quellcode:
Block1;
Block2;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.845 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 08:06
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
103 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 08:11
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
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher.
John C. Cornelius

Geändert von Andreas13 (11. Sep 2019 um 08:25 Uhr)
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
77 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 08:24
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!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.434 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 08:45
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.272 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 12:32
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...
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
412 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Sicherstellen das Procedure abgearbeitet wurde

  Alt 11. Sep 2019, 21:15
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf