Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / То ли у меня глюк, то ли в TThreadedQueue / 5 сообщений из 5, страница 1 из 1
09.01.2021, 00:41
    #40034310
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли у меня глюк, то ли в TThreadedQueue
Никак не могу понять, как можно убедиться в том, что метод TThreadedQueue<T>.PopItem вернул реальное значение из очереди, а не Default(T).

Вот реализация метода PopItem:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
function TThreadedQueue<T>.PopItem(var AQueueSize: Integer; var AItem: T): TWaitResult;
begin
  AItem := Default(T);
  TMonitor.Enter(FQueueLock);
  try
    Result := wrSignaled;
    while (Result = wrSignaled) and (FQueueSize = 0) and not FShutDown do
      if not TMonitor.Wait(FQueueNotEmpty, FQueueLock, FPopTimeout) then
        Result := wrTimeout;

    if (FShutDown and (FQueueSize = 0)) or (Result <> wrSignaled) then
      Exit;

    AItem := FQueue[FQueueOffset];

    FQueue[FQueueOffset] := Default(T);

    Dec(FQueueSize);
    Inc(FQueueOffset);
    Inc(FTotalItemsPopped);

    if FQueueOffset = Length(FQueue) then
      FQueueOffset := 0;

  finally
    AQueueSize := FQueueSize;
    TMonitor.Exit(FQueueLock);
  end;

  TMonitor.Pulse(FQueueNotFull);
end;



Видно, что в качестве Result он может вернуть либо wrSignaled либо wrTimeout.
Понятно, что если поток-producer вызовет метод DoShutDown, то будет возвращено Result=wrSignaled и значение Default(T), что неотличимо от нулевого значения, взятого из очереди.
Даже такая проверка после вызова PopItem не поможет:

Код: pascal
1.
2.
3.
4.
if MyQueue.ShutDown then
  if (Res=wrSignaled) and (MyQueue.QueueSize=0) then
    if Value=0 then
       Value is Invalid



т.к. этот ноль мог быть взять из очереди.

Хотя может я и зря загоняюсь. Можно наверно Default(T) рассматривать как недопустимое значение...
Вряд-ли кому-то придёт в голову добавлять в очередь нулевое значение :)
...
Рейтинг: 0 / 0
09.01.2021, 00:58
    #40034312
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли у меня глюк, то ли в TThreadedQueue
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Generics.Collections.TThreadedQueue.PopItemThe last two methods return a TWaitResult. If the queue is empty, then the monitor waits for it to push an element. If no element is pushed in PopTimeout, the method returns wrTimeout; otherwise, the method returns wrSignaled.
...
Рейтинг: 0 / 0
09.01.2021, 01:13
    #40034315
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли у меня глюк, то ли в TThreadedQueue
_Vasilisk_,

Ну это понятно и из реализации. Видимо забыли они про DoShutDown или времени нет доделать:)
...
Рейтинг: 0 / 0
09.01.2021, 13:56
    #40034373
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли у меня глюк, то ли в TThreadedQueue
DmSer
Видимо забыли они про DoShutDown или времени нет доделать:)
Не пойму в чем вопрос?
DmSer
Даже такая проверка после вызова PopItem не поможет:
Поможет такая
Код: pascal
1.
2.
3.
4.
if MyQueue.PopItem(Size, Item) = wrSignaled then begin
  if (Size = 0) and MyQueue.Shutdown then
    Invalid;
end
...
Рейтинг: 0 / 0
09.01.2021, 14:35
    #40034385
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли у меня глюк, то ли в TThreadedQueue
_Vasilisk_,

не поможет, т.к. Size = 0 так же если выбрали последний элемент в очереди, а Shutdown мог быть вызван после PopItem.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / То ли у меня глюк, то ли в TThreadedQueue / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]