Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#11

Re: Jobliste Kommunikation mit externem Gerät

  Alt 21. Nov 2006, 13:36
Das Speerobjekt brauchst du eigentlich nur in einer Unit, da wo die Liste verwaltet wird. Letztlich muss die Liste ja auch allen die darauf zugreifen bekannt sein. Du könntest dies verhalten z.B. in einer eigenen Unit kapseln (und die Liste umhüllen).
Dann hast einen Wrapper, der dir einfach sagt ob die Liste leer ist, der ein Objekt hinzufügen kann und wenn sie nicht leer ist dir das nächste Objekt zurück gibt. Beim erzeugen dieses Wrappers legst du eine Instanz Variable vom Typ TCriticalSection an, die dann immer gesperrt wird, bevor du ein Element in die Liste tust bzw. aus ihr entfernst:

Delphi-Quellcode:
type
  TJobList = class(TObject)
    private
      FSyncObj : TCriticalSection;
      FList : TObjectList;
    public
      constructor create;
      destructor destrory; override;

      procedure addJob(const Job : TBaseJob);
      procedure getNextJob(out Job : TBaseJob);
      function isEmpty : Boolean;
  end;

// Konstruktor und Destruktor sind klar, erzeugen bzw. freigeben der Objekte

procedure TJobList.addJob(const Job : TBaseJob);
begin
  self.FSyncObj.Acquire;
  self.FList.Add(Job);
  self.FSyncObj.Release;
end;

procedure TJobList.getNextJob(out Job : TBaseJob);
begin
  self.FSyncObj.Acquire;
  Job := TBaseJob(self.FList.Extract(self.FList[0]));
  self.FSyncObj.Release;
end;

function TJobList.isEmpty : Boolean;
begin
  self.FSyncObj.Acquire;
  result := self.FList.Count > 0;
  self.FSyncObj.Release;
end;
  Mit Zitat antworten Zitat