Настройка потока перед запуском
Раз уж я затронул тему потоков - расскажу об одной хитрости, которую я использую. Довольно часто поток необходимо настраивать при создании, например - задавать начальные параметры, данные для обработки. В принципе, сложного ничего нет и задание начальных параметров потока довольно-таки обычное дело.
Как красиво поступить в ситуации, когда данные хранятся в большом массиве типов 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
Рубрики: Общее
