Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
threadlist
Guest
Я хочу периодически сбрасывать данные и тред-листа в лист, а потом этот лист пускать в обработку, при этом тред-лист должен опустошиться и быть свободным для приёма новых данных.

Какая из этих конструкция правильная:

1.
  List := ThreadList.LockList;
  ThreadList.Clear;
  ThreadList.Unlock;

  while ... List.Count - 1 do
  begin
    DoLongJob;
  end


2.
  List.AddRange(ThreadList.LockList.ToArray);
  ThreadList.Clear;
  ThreadList.Unlock;

  while ... List.Count - 1 do
  begin
    DoLongJob;
  end
11 янв 17, 19:55    [20095425]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
Bred eFeM
Member

Откуда:
Сообщений: 374
type _TList = class private FList: TList; end;
//

  List := ThreadList.LockList;
    _TList(ThreadList).FList := TList.Create;
  ThreadList.UnlockList;

  while ... List.Count - 1 do
  begin
    DoLongJob;
  end
12 янв 17, 03:38    [20096491]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
schi
Member

Откуда: Москва
Сообщений: 1425
threadlist
Я хочу периодически сбрасывать данные и тред-листа в лист, а потом этот лист пускать в обработку, при этом тред-лист должен опустошиться и быть свободным для приёма новых данных.

Какая из этих конструкция правильная:

1.
  List := ThreadList.LockList;
  ThreadList.Clear;
  ThreadList.Unlock;

  while ... List.Count - 1 do
  begin
    DoLongJob;
  end


2.
  List.AddRange(ThreadList.LockList.ToArray);
  ThreadList.Clear;
  ThreadList.Unlock;

  while ... List.Count - 1 do
  begin
    DoLongJob;
  end


Никакая.

var
  List: TList;
  ThreadListData: TList;
...
  List := TList.Create;
  ThreadListData := ThreadList.Lock;
  try
    List.Assign(ThreadListData);
    ThreadList.Clear;
  finally
    ThreadList.Unlock;
  end;

... dolongjob
12 янв 17, 10:46    [20097161]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
threadlist
Guest
Bred eFeM , интересно, но хак не надежен.

schi, замена ToArray на Assign
12 янв 17, 15:10    [20098752]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
Bred eFeM
Member

Откуда:
Сообщений: 374
threadlist
интересно, но хак не надежен.
то ты внутренности TMonitor не видел - вот там надежный хак прикручен...
12 янв 17, 15:42    [20098979]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
threadlist
Guest
Bred eFeM
threadlist
интересно, но хак не надежен.
то ты внутренности TMonitor не видел - вот там надежный хак прикручен...

Что не так с TMonitor?
12 янв 17, 15:47    [20099003]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
Bred eFeM
Member

Откуда:
Сообщений: 374
например,
function GetMonitorFieldAddress(const AObject: TObject): PPMonitor; inline;
begin
  Result := PPMonitor(PByte(AObject) + AObject.InstanceSize - hfFieldSize + hfMonitorOffset);
end;
12 янв 17, 16:16    [20099134]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
schi
Member

Откуда: Москва
Сообщений: 1425
Bred eFeM
например,
function GetMonitorFieldAddress(const AObject: TObject): PPMonitor; inline;
begin
  Result := PPMonitor(PByte(AObject) + AObject.InstanceSize - hfFieldSize + hfMonitorOffset);
end;


И что тут не так ?
12 янв 17, 18:32    [20099773]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
Bred eFeM
Member

Откуда:
Сообщений: 374
schi, я и не говорю, что что-то не так. Просто 'надежный хак', вместо нормального обращения к полю. (зачем так было сделано, может кто раскроет секрет?)
12 янв 17, 21:31    [20100313]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
threadlist
Guest
schi, замена ToArray на Assign

Не годится. В случае с генерик TList-том. Соотв ToArray вариант остается. То есть второй.
12 янв 17, 21:39    [20100334]     Ответить | Цитировать Сообщить модератору
 Re: TList = TThreadList.LockList - периодическое сбрасывание данных в потоке  [new]
schi
Member

Откуда: Москва
Сообщений: 1425
Bred eFeM
schi, я и не говорю, что что-то не так. Просто 'надежный хак', вместо нормального обращения к полю. (зачем так было сделано, может кто раскроет секрет?)


Видимо из-за этого "Every TObject derived instance can be used as a monitor", адрес управляющей структуры монитора находится после данных объекта (InstanceSize)

Я честно говоря, с мониторами в этом виде дела не имел, потому могу только гадать. Но подобных участков кода в system.pas и прочих typinfo.pas хватает
12 янв 17, 22:59    [20100565]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить