Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2014, 12:00   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Как передать динамический массив в поток?

Привет!

Пишу так:

Код:
type
  Thread = class(TThread)
    arr:array of string;
  protected
    procedure Execute; override;
    constructor Create(Tarr:array of string);
  end;

constructor Thread.Create(Tarr:array of string);
begin
  inherited Create(True);
  arr:=Tarr;
end;

procedure TForm1.Button1Click(Sender: TObject);
var arr:array of string;
begin
SetLength(arr,3);
T:=Thread.Create(arr);
T.FreeOnTerminate:=true;
T.Resume;
T.Priority:=tpNormal;
end;
Получаю ошибку в конструкторе. Что то не так?
bilibian вне форума Ответить с цитированием
Старый 28.02.2014, 12:12   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, динамический массив это достаточно навороченная штукенция. (как, впрочем и String) - это указатель...

Для начала, я бы вынес описание типа отдельно:
Код:
type 
 TMyDynStringArray =   array of string;
...
type
  Thread = class(TThread)
....
  protected
    procedure Execute; override;
    constructor Create(Tarr:TMyDynStringArray);
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.02.2014, 12:44   #3
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Ошибка в строке:

Код:
constructor Thread.Create(Tarr:array of string);
begin
  inherited Create(True);
  arr:=Tarr; // отладчик красит эту строку красным
end;
[dcc32 Error] Unit1.pas(81): E2010 Incompatible types: 'Dynamic array' and 'array of string'

Serge_Bliznykov, Ваш вариант ничего не меняет
bilibian вне форума Ответить с цитированием
Старый 28.02.2014, 13:05   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
constructor Thread.Create(Tarr:array of string);
неужели я непонятно написал?!!

надо заменить Thread.Create(Tarr:array of string);
на
Код:
constructor Thread.Create(Tarr:TMyDynStringArray);
....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.02.2014, 13:09   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Serge_Bliznykov, Ваш вариант ничего не меняет
Не правда. Если сделать так как Серж предлагает, то ошибки не будет. Другое дело, что на самом деле при таком способе передачи массив arr в потоке тот же, что передается при вызове. И могут быть проблемы при его изменении, если не предусмотрена синхронизация
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.02.2014, 13:21   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
E2010 Incompatible types: 'Dynamic array' and 'array of string'
Код:
type TMyArr =array of string;
thread.Create(tarr: TMyArr);

var
  arr: TmyArr;
подробности по ключевым словам открытый массив (procname(r: array of ...) / динамический массив (var r: array of ...);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.02.2014 в 13:23.
evg_m вне форума Ответить с цитированием
Старый 28.02.2014, 13:28   #7
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Serge_Bliznykov я так и сделал.

Ошибка исчезла когда, я прописал так:

Код:
type 
 TMyDynStringArray =   array of string;

type
  Thread = class(TThread)
    arr:TMyDynStringArray;
  protected
    procedure Execute; override;
    constructor Create(Tarr:TMyDynStringArray);
  end;

constructor Thread.Create(Tarr:TMyDynStringArray);
begin
  inherited Create(True);
  arr:=Tarr;
end;

procedure TForm1.Button1Click(Sender: TObject);
var arr:TMyDynStringArray;
begin
SetLength(arr,3);
T:=Thread.Create(arr);
T.FreeOnTerminate:=true;
T.Resume;
T.Priority:=tpNormal;
end;
bilibian вне форума Ответить с цитированием
Старый 28.02.2014, 14:37   #8
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Спасибо за помощь!
bilibian вне форума Ответить с цитированием
Старый 28.02.2014, 15:22   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Пожалуйста.
я вообще не умею с потоками обращаться, но я обращаю ваше внимание на пост #5 (с) Аватар...

Если из разных потоков будете изменять массив, то понадобится делать это через синхронизацию!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать неинициализированный двухмерный динамический массив в функцию zorg-kirill Общие вопросы C/C++ 3 02.03.2013 19:44
Как передать структуру в поток при _beginthread Ksardas13 Общие вопросы C/C++ 2 10.03.2012 05:00
Как передать параметр в поток? Pack Общие вопросы Delphi 3 22.02.2012 12:09
Как передать Динамический массив в функцию? RainCat Помощь студентам 4 13.04.2011 11:25
Как правильно передать через ссылку двумерный динамический массив? amerhant Общие вопросы C/C++ 2 21.04.2010 23:50