Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1313501980
TInd
2011-08-16 17:39
2011.12.11
Работа с TIFF.


15-1313551370
ixen
2011-08-17 07:22
2011.12.11
Сброс пароля BIOS


15-1313684586
Медвежонок Пятачок
2011-08-18 20:23
2011.12.11
форсайт


1-1276837690
Kukolev
2010-06-18 09:08
2011.12.11
Кнопки на панели задач


2-1314338415
Gevs
2011-08-26 10:00
2011.12.11
Мышь





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский