MVC und ProgressDialoge

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
maxip
User
Beiträge: 61
Registriert: Dienstag 11. März 2008, 09:43

Sonntag 13. Juli 2008, 01:10

Hallo,

ich halte mich für gewöhnlich an das MVC-Prinzip, jetzt habe ich aber folgendes Problem:

es gibt ein database-package, darin eine Klasse mit einer Methode, die alle Einträge eines bestimmten Types löschen soll. Dies sind meist ein paar hundert Beiträge, und jeder Beitrag hat noch Einträge in einigen anderen Tabellen. (Realisiert ist das ganze durch in C++ geschr. Bibliotheken, is aber nicht wichtig).

Jedenfalls dauert das sehr lange und der User möchte natürlich sehen, dass etwas passiert. Also macht man einen Progress-Dialog.

Wie verbinde ich nun aber die Arbeit der Datenbankklassen-Methode mit dem ProgressDialog?

Ich erzeuge einen Thread für die Datenbankklassen-Methode und erzeuge einen Dialog mit einer Fortschrittsanzeige. Wie verbinde ich das Ganze, so dass die Datenbankklasse aber genausogut von einer Konsolenanwendung aufgerufen werden kann?

Signals and Slots wäre eine gute Möglichkeit, aber falls möglich sollte man hier auf alles Framework- und Guitoolkitspezifische verzichten.

Man könnte vielleicht als Parameter (default-wert None) eine Funktion übergeben, die nach einem Fortschritt der Arbeit aufgerufen werden soll. Diese könnte dann je nachdem den progressdialog informieren oder z:b. ne funktion aufrufen die einen stern* oder punkt . auf die konsole malt.

Was haltet ihr von dieser Idee? und wie genau wird die umgesetzt? also rein schematisch gesehen.

oder was macht ihr in so einem fall?


ciao
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 13. Juli 2008, 08:43

In der Regel gibt man einer länger laufenden Aufgabe in deinem Fall ein Objekt (Callback) mit, über dass dann der Fortschritt berichtet werden kann. Dieses Objekt sollte Teil des UI-Rahmenwerks sein und sich mit Problemen wie Synchronisierung und verschiedenen Threads herumschlagen.

Du beschreibst ja schon eine derartige Lösung.

Schematisch könnte ich mir das so vorstellen:

Code: Alles auswählen

class Task:
  def run(self, progress): pass

class Progress:
  def set_message(self, message):
    "task asks progress to display the given message."

  def set_state(self, step, max_steps):
    "task asks progress to display that the given step has been reached."

class DumpDatabaseTask(Task):
  def run(self, progress):
    for table in tables:
      progress.set_message("dumping table %s" % table.name)
      row_count = table.row_count
      for i, row in enumerate(table.rows):
        ...
        progress.set_state(i, row_count)

DumpDatabaseTask().run(progress)
Stefan
Antworten