Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать дин. массив в поток. (TThread) 
V
    Опции темы
pukin
  Дата 28.3.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007
Где: Россия. Москва/Ко ролёв

Репутация: нет
Всего: нет



Здравствуйте!

Подскажите как передать в поток заполненный дин. массив.

Пример:
Код

type TTest = record
               A,B,C : String;
               M     : Integer;
             end;

type
  TThrd = class(TThread)
  private
    FArr: array of TTest;
  protected
    procedure Execute; override;
  public
    property Arr: array of TTest write FArr; // Error
  end;

Сказать текст ошибки сейчас не могу. Т.к. пишу на коленке, но помню, что не получалось "с налёту убить Федота", т.е. передать массив потоку.
Покажите на реальном примерчике, чтобы в голове сразу устаканилось.

Заранее, премного благодарен.

 smile 
PM MAIL   Вверх
DmitryHT
Дата 28.3.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 31.8.2007

Репутация: нет
Всего: нет



через цикл по одному значению?
PM MAIL   Вверх
pukin
Дата 28.3.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007
Где: Россия. Москва/Ко ролёв

Репутация: нет
Всего: нет



Цитата(DmitryHT @ 28.3.2008,  16:00)
через цикл по одному значению?

Массив динамический я изначально не знаю сколько в нём данных.
PM MAIL   Вверх
Rennigth
Дата 28.3.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



pukin
Цитата(pukin @  28.3.2008,  15:51 Найти цитируемый пост)
, но помню, что не получалось 

Значит что-то не так делал. Create вызывай с Susperded True, потом копируй массив, потом Resume делай. 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
VICTAR
Дата 28.3.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



1) Попробуй привести к одному типу
2) А лучше сделай нормальный сеттер
PM MAIL   Вверх
pukin
Дата 28.3.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007
Где: Россия. Москва/Ко ролёв

Репутация: нет
Всего: нет



smile 

Кто-нибудь из знающих может сейчас на своей машине (с дельфёй под рукой) попробовать сделать пример где потоку передаётся заполненный дин. массив.

Добавлено через 2 минуты и 27 секунд
Цитата(Rennigth @ 28.3.2008,  16:17)
pukin
Цитата(pukin @  28.3.2008,  15:51 Найти цитируемый пост)
, но помню, что не получалось 

Значит что-то не так делал. Create вызывай с Susperded True, потом копируй массив, потом Resume делай.

TThread.Suspend и TThread.Resume здесь не причём =))))

Я, просто, не умею правильно организовывать передачу дин. массива потоку и посему обратился к вам.
Прошу вас, приведите живой пример.
PM MAIL   Вверх
Rennigth
Дата 28.3.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



держи:
Код

unit Unit29;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TSomeThread = class;

  TForm29 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FThread: TSomeThread;

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

  TSomeStruct = packed record
    SomeVar1: Integer;
    SomeVar2: string;
  end;

  TSomeStructList = array of TSomeStruct;

  TSomeThread = class(TThread)
  private
    FSomeStructList: TSomeStructList;
    function GetSomeStructList: TSomeStructList;
    procedure SetSomeStructList(const Value: TSomeStructList);
  protected
    procedure DoSomeWork;
    procedure Execute; override;
  public
    property SomeStructList: TSomeStructList read GetSomeStructList
      write SetSomeStructList;
  end;

var
  Form29: TForm29;

implementation

{$R *.dfm}

constructor TForm29.Create(AOwner: TComponent);
var
  lSomeStructList: TSomeStructList;
begin
  inherited;
  SetLength(lSomeStructList, 5);
  lSomeStructList[0].SomeVar2 := '0';
  lSomeStructList[1].SomeVar2 := '1';
  lSomeStructList[2].SomeVar2 := '2';
  lSomeStructList[3].SomeVar2 := '3';
  lSomeStructList[4].SomeVar2 := '4';

  FThread := TSomeThread.Create(True);
  FThread.SomeStructList := lSomeStructList;
  FThread.Resume;
end;

destructor TForm29.Destroy;
begin
  FThread.Terminate;
  WaitForSingleObject(FThread.Handle, INFINITE);
  FThread.Free;
  inherited;
end;

procedure TForm29.FormCreate(Sender: TObject);
begin

end;

{ TSomeThread }

procedure TSomeThread.DoSomeWork;
begin
  Application.MainForm.Caption := FSomeStructList[Random(Length(FSomeStructList))].SomeVar2;
end;

procedure TSomeThread.Execute;
begin
  inherited;
  while not Terminated do
  begin
    Sleep(100);
    if not Terminated then
      Synchronize(DoSomeWork);
  end;
end;

function TSomeThread.GetSomeStructList: TSomeStructList;
begin
  Result := FSomeStructList;
end;

procedure TSomeThread.SetSomeStructList(const Value: TSomeStructList);
begin
  FSomeStructList := Value;
end;

end.




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
VICTAR
Дата 28.3.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Вот конкретно с динамическим массивом

Это сообщение отредактировал(а) VICTAR - 29.3.2008, 19:28
PM MAIL   Вверх
pukin
Дата 28.3.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007
Где: Россия. Москва/Ко ролёв

Репутация: нет
Всего: нет



Всё понял, спасибо большое за ответы.  smile 
PM MAIL   Вверх
MetalFan
Дата 28.3.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



pukin, только учти, что не один пример не предусматривает корректную синхронизацию данных, что может привести к непредвиденным багам


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Rennigth
Дата 28.3.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(MetalFan @  28.3.2008,  19:59 Найти цитируемый пост)
pukin, только учти, что не один пример не предусматривает корректную синхронизацию данных, что может привести к непредвиденным багам 

ты по поводу того что массив желательно былобы копирнуть?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MetalFan
Дата 28.3.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



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

кстати
Цитата(Rennigth @  28.3.2008,  16:32 Найти цитируемый пост)
destructor TForm29.Destroy;
begin
  FThread.Terminate;
  WaitForSingleObject(FThread.Handle, INFINITE);
  FThread.Free;
  inherited;
end;

кстати тут достаточно просто FThread.Free


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
VICTAR
Дата 28.3.2008, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



MetalFan, что не так в моем примере? smile 
PM MAIL   Вверх
MetalFan
Дата 29.3.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



VICTAR, у тебя передается ссылка на дин.массив в трэд, и потом в 2х разных потоках ведется с ним работа... если я не ошибаюсь

Добавлено через 5 минут и 51 секунду
нет, не ошибаюсь. так работать с данными из разных потоков недопустимо!


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
VICTAR
Дата 29.3.2008, 10:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(MetalFan @  29.3.2008,  09:50 Найти цитируемый пост)
так работать с данными из разных потоков недопустимо! 

Согласен.
Был не прав, прошу прощения.
Обиделся и встал в угол
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0940 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.