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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2019, 02:33   #1
PaHaNjkee
Delphi 10 Seattle
Пользователь
 
Аватар для PaHaNjkee
 
Регистрация: 01.11.2010
Сообщений: 90
Радость Сброс данных массива при запуске потока

Всем привет. Есть классы:
Код:
TAccountsList = class(TObject)
  private
    fAccounts: array of TAccount;
    fAccountsCount: Integer;
  public
    constructor Create;
    destructor Destroy;

    procedure Add(fAccount: TAccount);
    procedure Clear;
    procedure Copy(from: TAccountsList);
    property Count: Integer read fAccountsCount;
    function Get(Index: Integer): TAccount;
  end;

TTasksThread = class(TThread)
  private
    fTaskThread: array of TTaskThread;
    fThreadCount: Integer;
    fList: TAccountsList;
    fStopping: Boolean;
    procedure DoTerminate(Sender: TObject);
  protected
    procedure Execute; override;
  public
    constructor Create(aList: TAccountsList; aThreadCount: Integer);
    destructor Destroy;

    property Stopping: boolean read fStopping write fStopping;
  end;
В методе создания потока такой код:
Код:
constructor TTasksThread.Create(aList: TAccountsList; aThreadCount: Integer);
begin
  inherited Create(true);
  FreeOnTerminate := true;
  fList := TAccountsList.Create;
  fList.Copy(aList);
  fThreadCount := aThreadCount;
  OnTerminate := DoTerminate;
  fStopping := false;
  Test(fList.Get(0).Login); // ВЫВОДИТ Login. В начале метода Execute тут будет пустота
  Resume;
end;
fList получает все нужные данные и если вызвать fList.Get(0).Login, то данные отображаются верно. Как только этот код выполнить в методе Execute потока, абсолютно все данные теряются. В чем может быть проблема? Код запуска потока:
Код:
aList := TAccountsList.Create;
  accInfo := TAccount.Create;
  try
    for i := 0 to fAccountsList.Count-1 do
    begin
      accInfo.Clear;
      accInfo.Login := 'Login';

      aList.Add(accInfo);
    end;

    fMainThread := TTasksThread.Create(aList, threadsCount);
  finally
    accInfo.Free;
    aList.Free;
  end;
Ну и соответственно код класса:
Код:
{ TAccountsList }

procedure TAccountsList.Add(fAccount: TAccount);
begin
  SetLength(fAccounts, fAccountsCount+1);
  fAccounts[fAccountsCount] := fAccount;
  Inc(fAccountsCount);
end;

procedure TAccountsList.Clear;
begin
  SetLength(fAccounts, 0);
  fAccountsCount := 0;
end;

procedure TAccountsList.Copy(from: TAccountsList);
var
  i: Integer;
begin
  self.Clear;
  for i := 0 to from.Count-1 do
    self.Add(from.Get(i));
end;

constructor TAccountsList.Create;
begin
  inherited Create;
  SetLength(fAccounts, 0);
end;

destructor TAccountsList.Destroy;
begin
  SetLength(fAccounts, 0);
  fAccountsCount := 0;
  fAccounts := nil;
  inherited Destroy;
end;

function TAccountsList.Get(Index: Integer): TAccount;
begin
  if (Index >= Length(fAccounts)) or (Index < 0) then
    raise Exception.Create('Invalid index [TAccountsList]');

  result := fAccounts[Index];
end;
PaHaNjkee вне форума Ответить с цитированием
Старый 09.01.2019, 09:19   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

ВСЕ объекты представлены в коде своими ссылками
accInfo: TAccount;
именно поэтому и нужно писать присвоение создания accInfo := TAccount.Create;

fAccounts[fAccountsCount] := fAccount; //это дублирование ССЫЛКИ на объект, а НЕ дублирование объекта.

Код:
    fMainThread := TTasksThread.Create(aList, threadsCount); 
// при создании потока копируется ССЫЛКА на объект accInfo; fAccounts[fAccountsCount] := fAccount;
  finally
    accInfo.Free; //затем сам объект уничтожается 
    aList.Free;
  end;
// и начинает работать поток НО объекта-то нет
либо пересоздавать объект внутри потока(делать копию объекта),
Цитата:
faccount[...]:=TAccount.Create;
+ копирование его внутренних данных
либо НЕ уничтожать его после запуска, а когда-нибудь потом(когда ВСЕ потоки закончатся OnTerminate у всех потоков)
Код:
    accInfo.Free; //затем сам объект уничтожается 
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.01.2019 в 09:25.
evg_m на форуме Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
считывание двумерного массива из потока данных mahatmaQL Общие вопросы Delphi 5 26.06.2016 20:55
Ошибка при запуске программы с базой данных Kreadlling БД в Delphi 2 05.04.2011 11:57
Pascal. Программа по обработке массивов данных. При запуске возникают ошибки. Student1 Помощь студентам 3 04.01.2011 21:56
Сброс формата текста при обновлениии ama3ono4ka Microsoft Office Word 10 18.08.2010 10:42
Delphi 7 и СРВ, коррекция данных - файл при запуске показывает работу круиз-контроля Юлия Мю Помощь студентам 30 05.12.2008 19:34