![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможно ли создать массив с именем в процессе выполнения пр...? [D7]
Константин © (2011-08-25 13:08:00)Здравствуйте. Подскажите решение в одной задачке. Существуют несколько потоков. Запускаются они путем запуска одного и того же кода. В этом коде формируется массив данных. Получить доступ к этому массиву данных не получается т.к. его имя одно и тоже во всех созданных потоках. Можно ли процессе выполнения программы создавать массивы с заранее неизвестным именем? Т.е. имя массиву присваивать в зависимости от номера потока и получать к этому массиву доступ.
sniknik (2011-08-27 01:51:00) [1]на скорость работы в таком подходе смотреть нужно в последнюю очередь...
вот какой толк в супер скоростных машинах формулы один, если они супер сломаны...? и будут они кучей на обочине валятся, и самый тормозной запорожец будет их "делать как стоячих".
так и будет, имхо.
> P.S. Почитал бы ты хоть какой-нибудь учебник по Дельфи.
тут уже нужны крайние меры... типа - нанять программиста.
Германн (2011-08-27 01:02:00) [2]
> Константин (26.08.11 23:37) [17]
>
> А не подскажите. Перенос массива из public в private сильно
> замедляет работу с ним?
Нуу. На Ctrl+X, Ctrl+V нужно несколько секунд. На обдумывание нужно ли всё это - плюс пару недель. :)
P.S. Почитал бы ты хоть какой-нибудь учебник по Дельфи.
Palladin (2011-08-26 23:43:00) [3]да ппц замедляет... быстрее на северный полюс скататься...
Константин (2011-08-26 23:37:00) [4]А не подскажите. Перенос массива из public в private сильно замедляет работу с ним?
Константин (2011-08-26 22:56:00) [5]А ларчик просто открывался :) Я в первый раз видать не в public записал а в общие переменные. Вот он у меня и выдавал фиг знает что. Спасибо!
Sha (2011-08-26 22:53:00) [6]> Kilkennycat © (26.08.11 22:43) [14]
Если за полтора дня не подействовало, то дальше ждать бесполезно.
Kilkennycat (2011-08-26 22:43:00) [7]
> Sha © (26.08.11 22:37) [13]
с велосипедами пети и васи нагляднее.
Sha (2011-08-26 22:37:00) [8]> Если я запишу массив в public то получится лобуда
> т.к. массив DataDim одинаково называется во всех созданных потоках.
Вовсе не одинаково:
MADC1.DataDim,
MADC2..DataDim,
...
MADC12..DataDim
MBo (2011-08-26 22:32:00) [9][2] читал?
Константин (2011-08-26 22:23:00) [10]Проблема в следующем. Существует несколько (порядка 10 и более) периферийных устройств. Устройства одинаковые. Управление этими устройствами осуществляется при помощи отдельно созданного потока. В поток управляет устройством, записывает с него информацию и сохраняет на диске. Общение потока с основной программой не осуществляется для экономии ресурсов. Сейчас возникла задача получать информацию из потоков. DataDim - массив данных в которых записывается информация из устройства. Один из вариантов решения задачи: создать массив в основном потоке и записывать в него информацию из потоков. Но скорее всего данный вариант будет медленным. Другой вариант - получить доступ к массиву в потоке. Если я запишу массив в public то получится лобуда т.к. массив DataDim одинаково называется во всех созданных потоках. Т.е. если я где нибудь в программе напишу a:=DataDim[1] то в "а" запишется значение из всех потоков. Для одного потока public подойдет, для двух уже нет.
Германн (2011-08-26 00:53:00) [11]
> а вообще от задачи зависит
+1
Слишком просто вопрос звучит, но слишком сложно понять, а в чём собственно проблема?
sniknik (2011-08-25 23:51:00) [12]а лучше туда доступ не получать... хоть через владельца хоть через имя. ведь получив, ты туда тут же что-то писать начнешь, извне, а это чревато при работающем потоке. если без синхронизации/критических секций. а если нужно при не работающем, на старте, то передавать при создании (конструктор переопределить).
а вообще от задачи зависит, что делается, для чего... там может вообще потоки не нужны, а мы тут гадаем способ передачи неизвестных данных в них.
если решать задачу, а не конкретный "затык".
Palladin (2011-08-25 23:40:00) [13]если ты хочешь получить к ним доступ, на кой хрен ты их в private описал? а если понимаешь зачем описал в private на кой хрен ты хочешь получить к ним доступ?
Юрий Зотов (2011-08-25 23:04:00) [14]> Константин
Замените private на public. Хотя это не лучший вариант, но сойдет и он.
Amoeba_ (2011-08-25 22:48:00) [15]Случаем не это ли надо?
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 22:47:00) [16]Владельцы разные... Но как тогда обратиться к велосипеду выбранного владельца? У меня:
MADC1, MADC2... MADC12: WADC;
...
WADC = class(TThread)
private
DataDim : array [1..9600020] of byte;
Как получить доступ к DataDim потока MADC2?
Сергей М. (2011-08-25 15:49:00) [17]
> sniknik © (25.08.11 15:04) [3]
Да ну пусть так)
Все равно велосипеды на лицо разные, никак не перепутаешь)
sniknik (2011-08-25 15:04:00) [18]> Один Васин.Велосипед , другой Петин.Велосипед.
велосипед по изобретению имен велосипедов...
у автора будет ВелосипедоВасин и ВелосипедоПетин... :)
Сергей М. (2011-08-25 14:35:00) [19]
> имя одно и тоже во всех созданных потоках
Зато "имена" у всех потоков разные.
У Васи есть велосипед.
У Пети есть велосипед.
И там и здесь велосипед. Как отличить ?
Оч просто:
Один Васин.Велосипед , другой Петин.Велосипед.
И. Павел (2011-08-25 13:22:00) [20]Можно использовать ссылки на массив, давая им какие угодно имена. Хотя не понятно, зачем так поступать. Проще во всех потоках использовать одно имя массива, не забывая про 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;