Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   BlockingQueue in Delphi 7 (https://www.delphipraxis.net/168091-blockingqueue-delphi-7-a.html)

Nic2012 4. Mai 2012 13:31

BlockingQueue in Delphi 7
 
Ich habe eine C#-Klasse in Delphi zu migrieren:
Wie würde man sowas in D7 lösen:
Code:
   public class BlockingQueue
   {
      private bool closing;
      private readonly Queue<byte[]> queue = new Queue<byte[]>();
      public int Count
      {
         get
         {
            lock(queue)
            {
               return queue.Count;
            }
         }
      }
      public BlockingQueue()
      {
         lock(queue)
         {
            closing = false;
            Monitor.PulseAll(queue);
         }
      }
      public bool Enqueue(byte[] item)
      {
         lock (queue)
         {
            if(closing || null == item)
            {
               return false;
            }
            queue.Enqueue(item);

            if(queue.Count == 1)
            {
               // wake up any blocked dequeue
               Monitor.PulseAll(queue);
            }
            return true;
         }
      }
      public void Close()
      {
         lock(queue)
         {
            if(!closing)
            {
               closing = true;
               queue.Clear();
               Monitor.PulseAll(queue);
            }
         }
      }
      public bool TryDequeue(out byte[] value, int timeout = Timeout.Infinite)
      {
         lock(queue)
         {
            while(queue.Count == 0)
            {
               if(closing || 
                  (timeout < Timeout.Infinite) || 
                  !Monitor.Wait(queue, timeout))
               {
                  value = null;
                  return false;
               }
            }
            value = (byte[])queue.Dequeue();
            return true;
         }
      }
      public void Clear()
      {
         lock(queue)
         {
            queue.Clear();
            Monitor.Pulse(queue);
         }
      }
   }

himitsu 4. Mai 2012 13:51

AW: BlockingQueue in Delphi 7
 
Du nimmst eine Queue-Klasse (weiß nicht ab wann es TQueue im Delphi gibt), baust dort eine CriticalSection ein (TCriticalSection oder direkt über die WinAPI), sicherst alle Zugriffsmethoden damit ab und fertig.

Bezüglich der CS gibt es ausreichend Beispiele zu finden
und eine "threadsichere Queue/Stack/List" gibt es hier auch zu finden (ist ja alles das Gleiche).

Nic2012 9. Mai 2012 09:54

AW: BlockingQueue in Delphi 7
 
Habe es mit TQueue und TCriticalSection als Absicherung in D7 fast umgesetzt. Nur welche Alternative habe ich in D7 für die Monitor-Klasse, die es erst seit D2009 gibt ?
Bzw. die erste Hürde ist die Wait-Methode von TMonitor. Kann man ev. dafür WaitForSingleObject verwenden ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 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