Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
ВнизВозможно ли создать массив с именем в процессе выполнения пр...? Найти похожие ветки
← →
Константин (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c