Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.11;
Скачать: CL | DM;

Вниз

Возможно ли создать массив с именем в процессе выполнения пр...?   Найти похожие ветки 

 
Константин   (2011-08-25 13:08) [0]

Здравствуйте. Подскажите решение в одной задачке. Существуют несколько потоков. Запускаются они путем запуска одного и того же кода. В этом коде формируется массив данных. Получить доступ к этому массиву данных не получается т.к. его имя одно и тоже во всех созданных потоках. Можно ли процессе выполнения программы создавать массивы с заранее неизвестным именем? Т.е. имя массиву присваивать в зависимости от номера потока и получать к этому массиву доступ.


 
И. Павел ©   (2011-08-25 13:22) [1]

Можно использовать ссылки на массив, давая им какие угодно имена. Хотя не понятно, зачем так поступать. Проще во всех потоках использовать одно имя массива, не забывая про synchronize.

procedure TForm1.Button1Click(Sender: TObject);
type TAr = array [0..3] of integer;
PAr = ^TAr;
const a: TAr = (1, 2, 3, 4);
var p: PAr;
begin
 p := @a;
 Button1.Caption := IntToStr(p[2]);
end;


 
Сергей М. ©   (2011-08-25 14:35) [2]


> имя одно и тоже во всех созданных потоках


Зато "имена" у всех потоков разные.

У Васи есть велосипед.
У Пети есть велосипед.

И там и здесь велосипед. Как отличить ?
Оч просто:

Один Васин.Велосипед , другой Петин.Велосипед.


 
sniknik ©   (2011-08-25 15:04) [3]

> Один Васин.Велосипед , другой Петин.Велосипед.
велосипед по изобретению имен велосипедов...
у автора будет ВелосипедоВасин и ВелосипедоПетин... :)


 
Сергей М. ©   (2011-08-25 15:49) [4]


> sniknik ©   (25.08.11 15:04) [3]


Да ну пусть так)
Все равно велосипеды на лицо разные, никак не перепутаешь)


 
Константин   (2011-08-25 22:47) [5]

Владельцы разные... Но как тогда обратиться к велосипеду выбранного владельца? У меня:
MADC1, MADC2... MADC12: WADC;
...
WADC = class(TThread)
 private
DataDim                               : array [1..9600020] of byte;
Как получить доступ к DataDim потока MADC2?


 
Amoeba_   (2011-08-25 22:48) [6]

Случаем не это ли надо?
Thread-local (or thread) variables are used in multithreaded applications. A thread-local variable is like a global variable, except that each thread of execution gets its own private copy of the variable, which cannot be accessed from other threads. Thread-local variables are declared with threadvar instead of var.


 
Юрий Зотов ©   (2011-08-25 23:04) [7]

> Константин

Замените private на public. Хотя это не лучший вариант, но сойдет и он.


 
Palladin ©   (2011-08-25 23:40) [8]

если ты хочешь получить к ним доступ, на кой хрен ты их в private описал? а если понимаешь зачем описал в private на кой хрен ты хочешь получить к ним доступ?


 
sniknik ©   (2011-08-25 23:51) [9]

а лучше туда доступ не получать... хоть через владельца хоть через имя. ведь получив, ты туда тут же что-то писать начнешь, извне, а это чревато при работающем потоке. если без синхронизации/критических секций. а если нужно при не работающем, на старте, то передавать при создании (конструктор переопределить).

а вообще от задачи зависит, что делается, для чего... там может вообще потоки не нужны, а мы тут гадаем способ передачи неизвестных данных в них.
если решать задачу, а не конкретный "затык".


 
Германн ©   (2011-08-26 00:53) [10]


> а вообще от задачи зависит

+1
Слишком просто вопрос звучит, но слишком сложно понять, а в чём собственно проблема?


 
Константин   (2011-08-26 22:23) [11]

Проблема в следующем. Существует несколько (порядка 10 и более) периферийных устройств. Устройства одинаковые. Управление этими устройствами осуществляется при помощи отдельно созданного потока. В поток управляет устройством, записывает с него информацию и сохраняет на диске. Общение потока с основной программой не осуществляется для экономии ресурсов. Сейчас возникла задача получать информацию из потоков. DataDim - массив данных в которых записывается информация из устройства. Один из вариантов решения задачи: создать массив в основном потоке и записывать в него информацию из потоков. Но скорее всего данный вариант будет медленным. Другой вариант - получить доступ к массиву в потоке. Если я запишу массив в public то получится лобуда т.к. массив DataDim  одинаково называется во всех созданных потоках. Т.е. если я где нибудь в программе напишу a:=DataDim[1] то в "а" запишется значение из всех потоков. Для одного потока public подойдет, для двух уже нет.


 
MBo ©   (2011-08-26 22:32) [12]

[2] читал?


 
Sha ©   (2011-08-26 22:37) [13]

> Если я запишу массив в public то получится лобуда
> т.к. массив DataDim  одинаково называется во всех созданных потоках.

Вовсе не одинаково:

MADC1.DataDim,
MADC2..DataDim,
...
MADC12..DataDim


 
Kilkennycat ©   (2011-08-26 22:43) [14]


> Sha ©   (26.08.11 22:37) [13]

с велосипедами пети и васи нагляднее.


 
Sha ©   (2011-08-26 22:53) [15]

> Kilkennycat ©   (26.08.11 22:43) [14]

Если за полтора дня не подействовало, то дальше ждать бесполезно.


 
Константин   (2011-08-26 22:56) [16]

А ларчик просто открывался :) Я в первый раз видать не в public записал а в общие переменные. Вот он у меня и выдавал фиг знает что. Спасибо!


 
Константин   (2011-08-26 23:37) [17]

А не подскажите. Перенос массива из public в private сильно замедляет работу с ним?


 
Palladin ©   (2011-08-26 23:43) [18]

да ппц замедляет... быстрее на северный полюс скататься...


 
Германн ©   (2011-08-27 01:02) [19]


> Константин   (26.08.11 23:37) [17]
>
> А не подскажите. Перенос массива из public в private сильно
> замедляет работу с ним?

Нуу. На Ctrl+X, Ctrl+V нужно несколько секунд. На обдумывание нужно ли всё это - плюс пару недель. :)

P.S. Почитал бы ты хоть какой-нибудь учебник по Дельфи.


 
sniknik ©   (2011-08-27 01:51) [20]

на скорость работы в таком подходе смотреть нужно в последнюю очередь...

вот какой толк в супер скоростных машинах формулы один, если они супер сломаны...? и будут они кучей на обочине валятся, и самый тормозной запорожец будет их "делать как стоячих".
так и будет, имхо.

> P.S. Почитал бы ты хоть какой-нибудь учебник по Дельфи.
тут уже нужны крайние меры... типа - нанять программиста.



Страницы: 1 вся ветка

Текущий архив: 2011.12.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
2-1314552284
Gu
2011-08-28 21:24
2011.12.11
Dll


2-1314272162
И. Павел
2011-08-25 15:36
2011.12.11
Deadlock при запросе на выборку в программе без явных блокировок


2-1314259058
slay64
2011-08-25 11:57
2011.12.11
Поток и БД


6-1247681286
_alex__
2009-07-15 22:08
2011.12.11
Взаимодействие со службой по TCP


15-1314016337
dreamse
2011-08-22 16:32
2011.12.11
Вопрос форма с тенью или обрез формы по png картинке