Гараж Delphi




Алгоритмы и функции для эффективной разработки приложений в среде программирования Delphi

Настройка потока перед запуском

30.04.2010 от semen

Раз уж я затронул тему потоков - расскажу об одной хитрости, которую я использую. Довольно часто поток необходимо настраивать при создании, например - задавать начальные параметры, данные для обработки. В принципе, сложного ничего нет и задание начальных параметров потока довольно-таки обычное дело.

Как красиво поступить в ситуации, когда данные хранятся в большом массиве типов Record (назовём его “Главным массивом”, ГМ), а каждый поток работает только с одним элементом массива? Раньше, я бы просто передавал в поток копию элемента массива и работал уже с ней (с копией). Такое решение не самое удачно, если элементы занимают достаточно большой объём. Можно использовать два пути, которые достаточно очевидны: первый - передавать в поток номер элемента ГМ и работать из потока с ГМ. Это решение неплохо подойдёт в 90% случаев и описывать его подробнее нет нужды. А что делать, если ГМ представлен в виде сложного связанного списка? В таком случае можно воспользоваться вторым подходом - передавать в поток только адрес в памяти элемента ГМ! Немного примеров:

Данные хранятся в массиве типа Record:

TMyRecord = Record 
  field1 : string;
  field2 : string;
  ......
end;
 
TMyArray = array of TMyRecord;
 
MyArray : TMyArray;

В потоке объявляется публичная переменная типа Pointer:

TMyThread = class(TThread)
........
public
    //address
    MemAddr  : ^TMyRecord;

При создании потока задаём адрес в памяти нужного элемента ГМ:

MyThread.MemAddr := @MyArray[i];

И в самом потоке можем обращаться непосредственно по адресу:

s := MemAddr^.field1;

При таком подходе не происходит дублирования данных в памяти.

См. также:
Сколько потребляет физической памяти ваша программа?
Ограничение количества потоков
Вызов элемента панели управления из Delphi

Рубрики: Общее

Оставьте комментарий

Заметьте: комментарии проверяются автором сайта. Нет смысла отправлять комментарий два раза.