AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Prozedur gegen sich selbst absichern

Ein Thema von DelphiManiac · begonnen am 27. Mär 2009 · letzter Beitrag vom 27. Mär 2009
Antwort Antwort
Seite 2 von 2     12
DelphiManiac

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

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 12:52
Wenn ich das so mache habe ich aber leider ein Problem:


Ich habe ja gesagt, dass ich z.B.: die Methode im Button aufrufe,
Delphi-Quellcode:
procedure TMainGUI.btnSaveDichteDampClick(Sender: TObject);
begin
  Screen.Cursor:=crHourGlass;
  if not(TuWas() = 0)) then
  begin
// Fehler ausgeben
  end;
  Screen.Cursor:=crDefault;
end;
Jetzt wird ja im Prinzip durch das zurücksetzen des Cursors signalisiert, dass die Methode fertig ausgeführt wurde, wenn ich das jetzt im Thread mache, habe ich diese direkte Rückkopplung nicht...

Dann müsste ich wieder auf den Thread warten...
//edit : Delphicode geändert
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#12

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 12:55
Du kannst mit MSDN-Library durchsuchenMsgWaitForMultipleObjects auf Messages und den Thread warten

Wenn messages eintreten, kannst du diese abarbeiten lassen, und wieder warten, wenn der Thread fertig ist, den Cursor wieder ändern ...

Ungefähr sowas: http://www.delphipraxis.net/internal...=696510#696510
  Mit Zitat antworten Zitat
DelphiManiac

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

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:13
Also im Prinzip gibt mir die Methode immer einen Wert zurück, den ich nach der Ausführung der Mehtode benötige.
Z.B.: um Ihn anzuzeigen.

Wenn ich jetzt einen Thread mache, obwohl ich warten will und dann doch wieder auf den Thread warte habe ich irgenwie Bauchschmerzen bei dem Programmdesign...
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:35
Nach der diffusen Problembeschreibung würde ich das mal so grob aus dem Bauch heraus wie folgt lösen:

- TuWas wird über einen Dispatcher aufgerufen (dazu gleich mehr)
- Der Dispatcher sorgt dafür, dass TuWas nur von ihm aufgerufen wird und mittels CriticalSection oder passendem anderen Mechanismus wird verhindert, dass TuWas zweimal parallel laufen kann.
- Der Mauscursor wird am Anfang von TuWas auf Sanduhr gesetzt und als letztes in TuWas wieder normalisiert
- Aufrufe von TuWas werden nicht direkt über Buttonclicks o.ä. erledigt sondern als Aufrufe an den Dispatcher, der daraufhin einen weiteren Eintrag in seine Worklist macht statt TuWas direkt aufzurufen
- Über einen Timer wird in regelmäßigen Intervallen geprüft ob TuWas noch beschäftigt ist, ansonsten wird TuWas erneut gemäß den Daten in der Warteliste ein weiteres Mal aufgerufen, bis die Liste abgearbeitet ist. Danach kann der Timer deaktiviert werden bis ein erneuter Aufruf des Dispatchers für neue Arbeit für TuWas sorgt.

Wenn man es ganz ordentlich machen wollte, müsste das ganze noch etwas anders aussehen, indem das ganze komplett eventbasiert abläuft. Das erhöht aber wiederum die Gefahr von Deadlocks ganz enorm und bedarf sorgfältiger Vorplanung. Wenn ich mir die Beschreibung nochmal durchlese, so komme ich zu dem Schluss, dass - auch wenn der Auftrag nur "Programmerweiterung" heisst - das ganze nicht ohne Review der bestehenden Konstruktion laufen sollte. Man kann vieles umsetzen, nur ist nicht alles technisch machbare auch sinnvoll
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
shmia

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

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:42
Zitat von DelphiManiac:
Delphi-Quellcode:
procedure TuWas;
begin
  // Prozedur tut was und hat einen exklusiven Zugriff auf eine Ressource
  // zwischendurch ruft sie Application.ProcessMessages auf
end;
Deine Procedure darf nicht einfach Application.ProcessMessages aufrufen!
Sie braucht einen Callback-Mechanismus, damit du genau steuern kannst, was passieren soll.
Delphi-Quellcode:
procedure TuWas(callback:TNotifyEvent);
begin
  // Prozedur tut was und hat einen exklusiven Zugriff auf eine Ressource
  // zwischendurch ruft sie den Callback auf
  for .... do
  begin
    if Assigned(callback) then callback(nil);
    // ....
  end;
end;
Das Callback kann als Procedure oder als Methode ausgeführt werden.
Ich habe hier mal eine Methode (TNotifyEvent) gewählt, weil ich mir gut vorstellen kann,
dass "TuWas" so komplex ist, dass man daraus eine Klasse machen müsste.
Andreas
  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 21:32 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