![]() |
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); } } } |
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). |
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 04:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz