AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Welches Form des wechselseitigen Auschlusses(Semaphore)?!
Thema durchsuchen
Ansicht
Themen-Optionen

Welches Form des wechselseitigen Auschlusses(Semaphore)?!

Ein Thema von DelphiManiac · begonnen am 25. Feb 2008 · letzter Beitrag vom 25. Feb 2008
Antwort Antwort
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

Welches Form des wechselseitigen Auschlusses(Semaphore)?!

  Alt 25. Feb 2008, 13:23
Hallo,

ich habe eine Methode meines Objekts, die intern Application.ProcessMessages aufruft,

ich will aber nicht, dass in die Methode nocheinmal "reingesprungen" wird, solange sie noch aktiv ist.
Meine Frage ist nun, welche Synchronisationsmethoden (viell. eine Semaphore?) ist da sinnvoll?
Oder kann man hier eine TCriticalsection nutzen?

so sieht meine Methode grob aus:

Delphi-Quellcode:
begin
  //--------> Hier SyncEintritt
  MachEtwasHier;
  MachEtwasDort;
  while (...) do
  begin
    MachHierWasSpektakulaeres;
    Application.ProcessMessages;
  end;
  //--------> Hier SyncAustritt
end;
Danke schonmal für eure Anregungen
P.S.: Habe das Script von Luckie habe ich gelesen
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Welches Form des wechselseitigen Auschlusses(Semaphore)?

  Alt 25. Feb 2008, 13:29
CriticalSection geht nicht, da du in eine CritcalSection mehrmals hineinlaufen kannst, solange du im gleichen Thread bist. Und das ist hier ja der Fall. Semaphore oder Event würde gehen, aber:
Application.ProcessMessages zu verwenden ist (fast) immer ein falscher Konzeptansatz. Und wenn du schon über Synchronistaionsobjekte sprichst, warum nimmst du nicht gleich einen Thread. Meistens läßt sich ja mit einem Thread das schlechte ineinanderwurschteln von Application.ProcessMessages vermeiden.

Lies dir mal zu Application.ProcessMessages das hier durch:
2. Absatz!
du bist dir ja der Problematik schon bewusst. Versuch sie besser gleich komplett zu umgehen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Welches Form des wechselseitigen Auschlusses(Semaphore)?

  Alt 25. Feb 2008, 13:31
eine Semaphore würde auch nur gehen wenn diese nicht blockiert. Da hier kein Zugriff durch mehrere Threads stattfindet sondern es immer wieder der gleiche Thread ist kann man es einfach über eine Variable absichern.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#4

Re: Welches Form des wechselseitigen Auschlusses(Semaphore)?

  Alt 25. Feb 2008, 15:22
@sirius:

Zitat:
Application.ProcessMessages zu verwenden ist (fast) immer ein falscher Konzeptansatz. Und wenn du schon über Synchronistaionsobjekte sprichst, warum nimmst du nicht gleich einen Thread. Meistens läßt sich ja mit einem Thread das schlechte ineinanderwurschteln von Application.ProcessMessages vermeiden.
Da hast du vollkommen Recht, das Design an der Stelle ist nicht sauber, genau da liegt das Problem. Ich doktor jetzt an
den Symptomen rum, müsste mir aber die Auslöser dafür vornehmen.

Das Problem was ich habe ist folgendes:

Ich habe eine Kommunikation zwischen einem Gerät und meiner PC-Soft. Es ist eine Frage Antwort Spielchen:

Frage: Gib mir Daten auf Adress 0x1000
...
Delphi-Quellcode:
// Hier liegt mein Problem, da ich aktiv auf die Antwort warte (warten muss);
// Ich warte auf 6 Bytes (wenn diese in einer Zeitpanne nicht da sind frage ich nochmals nach (3-mal)
// dann muss ich auf einen Timeout detektieren
...

Antwort: Hier die Daten

Und das ist alles in einem Funktionsaufruf gekapselt...
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Welches Form des wechselseitigen Auschlusses(Semaphore)?

  Alt 25. Feb 2008, 15:35
Das läuft in einem Thread ab... Der Thread heißt 'TAcquireDataThread'. Ihm übergibst du den Port (die 'Adresse') und der macht das dann für dich, also antriggern, warten, Daten lesen (max 3x) etc... Über das OnTerminate-Event teilt er dir mit, das er fertig ist (fehlerfrei oder auch nicht). Das blockiert deine Anwendung nicht und Du kannst problemlos mehrere davon abfeuern. Wenn immer nur ein Leser an einem bestimmten Port lauschen darf, dann erzeugst/öffnest du beim Thread-Beginn eine Semaphore mit Namen 'Port<Portnummer>'. So ist sichergestellt, das immer nur ein Thread pro Port aktiv ist...

Alternativ kannst du den Thread auch fehlerbedingt terminieren lassen, wenn es die Sempahore schon gibt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#6

Re: Welches Form des wechselseitigen Auschlusses(Semaphore)?

  Alt 25. Feb 2008, 15:48
Bisher habe ich meine Funktionen immer so gehabt:

function HoleStatus(Status:TStatus) : Integer;

Diese habe ich dann aufgerufen und den Status in der GUI angezeigt,
als direkten Rückgabwert habe ich dann ausgewertet, ob die Funktion erfolgreich ausgeführt wurde.

Angenommen ich mache das jetzt über einen Thread, dann weiss ich ja nie genau, wann er fertig ist, oder?

Denn wenn ich Schreizugriffe auf mein Gerät habe, dann muss ich nach Aufruf defintiv wissen, dass der Schreibzugriff,
erfolgreich war.

@alzaimar:

Den 'TAcquireDataThread' muss ich mir selbst erstellen, richtig?! Oder gibt es soetwas ähnliches schon?

Gruß und Danke!
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#7

Re: Welches Form des wechselseitigen Auschlusses(Semaphore)?

  Alt 25. Feb 2008, 15:53
@alzaimar:

Kannst du mir da evtl. mit ein bisschen Quellcode / Pseudocode auf die Sprünge helfen, da
ich dort nicht so richtig weiterkomme.

Wenn du mir mit dem Ansatz hilfst, wäre echt super!

Danke
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Welches Form des wechselseitigen Auschlusses(Semaphore)?

  Alt 25. Feb 2008, 17:37
Ich denke, dass du nur deine Benutzeroberfläche verriegeln musst!!
(Tip: Actions verwenden)
Damit wird verhindert, dass eine Message in Application.ProcessMessages verarbeitet wird und du erneut in deiner Prozedur landest.
Delphi-Quellcode:
begin
  BtnStart.Enabled := False; // <===
  try
    MachEtwasHier;
    MachEtwasDort;
    while (...) do
    begin
      MachHierWasSpektakulaeres;
      Application.ProcessMessages;
    end;
  finally
    BtnStart.Enabled := True; // <===
  end;
end;
Nachtrag:
wenn das oben eine Methode deiner eigenen Klasse ist, dann wäre Folgendes empfehlenswert:
Delphi-Quellcode:
begin
  // BtnStart.Enabled := False; // wird ins Formular verlagert
    MachEtwasHier;
    MachEtwasDort;
    while (...) do
    begin
      MachHierWasSpektakulaeres;
      // Eventhandler aufrufen, falls vorhanden
      if Assigned(FOnProgress) then
        FOnProgress(self); // <===
    end;
  // BtnStart.Enabled := True; // wird ins Formular verlagert
end;
Mit dieser Änderung kannst du von Aussen vorgeben, was passieren soll, während die Methode arbeitet.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:06 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