Begin und EndUpdate

Ein Schönheitsfehler, der mir aufgefallen ist:
Wenn man mittels Skript den Element-Typ ändert, zum Beispiel mit:

CurrentPlaylist.BeginUpdate;
pi.SetItemType(pitPackage);
CurrentPlaylist.EndUpdate;

Dann aktualisiert sich in der Playliste zwar ein Teil, wie das Icon, aber beispielsweise die Zeilenfarbe nicht (Config: GUI > Elementfarben) und auch nicht der TitleDisplayMode.
Wenn ich das Element in der Playliste “umherziehe”, dann updated es sich.

Ursache ist klar, werde ich beheben, danke.

Allerdings: Mit dem BeginUpdate/EndUpdate hat das nichts zu tun. Diese beiden Aufrufe sperren die Playlist für Bearbeitung durch andere Threads. Sonst kann es passieren, dass zwei Stücke Code (z.B. dein Script und ein interner Prozess) gleichzeitig auf die Playlist zugreifen. Stichwort Nebenläufigkeit.

Ein schönes Beispiel dafür ist, wenn du eine for-Schleife über die Anzahl der Elemente machst:

var
  i: integer;

begin
  CurrentPlaylist.BeginUpdate;
  try
    for i := 0 to CurrentPlaylist.GetCount - 1 do begin
      // irgendwas machen
    end;
  finally
     CurrentPlaylist.EndUpdate;
  end;
end.

Ohne das BeginUpdate/EndUpdate könnte es sein, das ein andere Thread ein Element aus der Playlist löscht, so dass die per GetCount ermittelte Länge nicht mehr zutrifft, und deine Schleife beim letzten Durchlauf in eine Exception läuft (Range Check Error).

Die Wahrscheinlichkeit ist relativ gering, aber Murphy’s Law kennt ihr ja alle.

Wenn man es benutzt, dann sollte man es auch immer in einem try..finally..end-Block einbetten, damit das EndUpdate auch wirklich ausgeführt wird, egal ob der innere Code eine Exception wirft oder nicht. Ansonsten verbleibt die Playlist im gesperrten Zustand, und du kannst mAirList eigentlich nur noch neustarten :man_shrugging:

Neben BeginUpdate/EndUpdate gibt es auch noch BeginRead/EndRead, das man benutzen kann, wenn man ausschließlich lesend auf die Playlist zugreift. Das entspricht dann wirklich einem einfachen Locking. Wohingegen das EndUpdate neben der Freigabe noch zusätzliche Dinge ausführt, wie z.B. das Backtiming neu berechnen, Player nachladen, gecachte Benachrichtungen an die GUI verschicken etc.

1 Like