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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача Stringlist в поток, Stringlist как property  
V
    Опции темы
uwannadie
Дата 15.6.2010, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

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



собственно сабж
заполнение StringList-а и вызов потока:
Код

Years := TStringList.Create;
  try
    for i := 0 to clbYears.Count - 1 do
    begin
      if clbYears.ItemEnabled[i] then
        Years.Add(clbYears.Items[i]);
    end;
    UpdateThread := TWorkThread.Create(True);
    UpdateThread.ApplicationDataPath := LocalPath;
    UpdateThread.ApplicationPath := ExtractFilePath(Application.ExeName);
    UpdateThread.DatabaseName := DBName;
    UpdateThread.ServerName := ServerName;
    UpdateThread.DatabaseUser := UserID;
    UpdateThread.DatabasePassword := Passwd;
    UpdateThread.UpdateYears := Years;
    UpdateThread.Resume;
    UpdateThread.WaitFor;
    UpdateThread.Free;
  finally
    Years.Free;
  end;

кусок кода потока:
Код

type
  TWorkThread = class(TThread)
  private
    ftpHost, ftpDir,
    ftpFile, ftpLocalPath,
    ftpUser, ftpPasswd,
    dbUser, dbPasswd, dbName, dbServerName,
    logMsg, lbl_caption, app_path, exe_path: WideString;
    pb_pos, pb_total_pos, pb_total_max: Integer;
    pYears: TStringList;
    procedure DoUncompress(const ASource, ADest: TFileName);
    procedure FixGzCRLF(const Filename: TFileName);
    function  ParseString(pString: String): TStringList;
    procedure ClearProgress;
    procedure UpdateFileProgress;
    procedure UpdateTotalProgress;
    procedure SetTotalProgressValue;
    procedure UpdateLog;
    procedure UpdateAfterTerminate;
    function FtpDownloadFile(strHost, strUser, strPwd: string;
                             Port: Integer; ftpDir, ftpFile,
                             TargetFile: string; dwFlags: Cardinal): Boolean;
  protected
    procedure Execute; override;
  public
    property ApplicationDataPath: WideString write app_path;
    property ApplicationPath: WideString write exe_path;
    property DatabaseName: Widestring write dbName;
    property ServerName: Widestring write dbServerName;
    property DatabaseUser: Widestring write dbUser;
    property DatabasePassword: Widestring write dbPasswd;
    property UpdateYears: TStringList write <== тут не понятно, как запихнуть данные в pYears ;
  end;

каким образом передать данные из StringList-a формы в параметр потока, т.к. обычным 
Код

property UpdateYears: TStringList write pYears

точно не получится smile 

Это сообщение отредактировал(а) uwannadie - 15.6.2010, 16:38
--------------------
PM MAIL   Вверх
RomanEEP
Дата 15.6.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

property UpdateYears: TStringList Read FYears write SetYears;

procedure TWorkThread.SetYears(Value: TStringList);
begin
  FYears.Assign(Value);
end;

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



1. Для передачи параметров можно использовать перекрытый конструктор TThread.Create - примеров и на форуме, и в интернете достаточно.
2. Схема с 
Код

property UpdateYears: TStringList write <== тут не понятно, как запихнуть данные в pYears ;
 тоже будет работать:

Код

property UpdateYears: TStringList write PYears;


3. 
Цитата(uwannadie @  15.6.2010,  16:37 Найти цитируемый пост)
 UpdateThread.WaitFor;


WaitFor заблокирует выполнение основного потока. В этом случае использование дополнительного потока не имеет смысла.


Это сообщение отредактировал(а) Демо - 15.6.2010, 16:55


--------------------
    
PM MAIL ICQ Skype   Вверх
Matematik
Дата 15.6.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

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



Код

private
  FStrings: TStrings;
public
  property Strings: TStrings read FStrings write FStrings;

PM MAIL WWW ICQ   Вверх
uwannadie
Дата 15.6.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

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



Цитата(Демо @ 15.6.2010,  16:54)
1. Для передачи параметров можно использовать перекрытый конструктор TThread.Create - примеров и на форуме, и в интернете достаточно.
2. Схема с 
Код

property UpdateYears: TStringList write <== тут не понятно, как запихнуть данные в pYears ;
 тоже будет работать:

Код

property UpdateYears: TStringList write PYears;


3. 
Цитата(uwannadie @  15.6.2010,  16:37 Найти цитируемый пост)
 UpdateThread.WaitFor;


WaitFor заблокирует выполнение основного потока. В этом случае использование дополнительного потока не имеет смысла.

если писать 
Код

property UpdateYears: TStringList write  pYears ;

то в процессе работы программы размер списка pYears равен 0, тобишь там ничего нету 

после замены на
Код

property UpdateYears: TStringList Read FYears write SetYears;
procedure TWorkThread.SetYears(Value: TStringList);
begin
  FYears.Assign(Value);
end;

при работе вылетает AV
--------------------
PM MAIL   Вверх
RomanEEP
Дата 15.6.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в констукторе есть строчка FYears := TStringList.Create ?
PM MAIL   Вверх
uwannadie
Дата 15.6.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

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



при
Код

property UpdateYears: TStringList write pYears;

в коде потока вызываю
Код

logmsg := IntToStr(pYears.Count - 1);
Synchronize(UpdateLog);

имеем
user posted image
где -1 - результат вышеопианных строк кода

Добавлено через 11 минут и 13 секунд
Цитата(RomanEEP @ 15.6.2010,  18:12)
в констукторе есть строчка FYears := TStringList.Create ?

есть, вот код:
Код

constructor TWorkThread.Create(CreateSuspended: Boolean);
begin
  pYears := TStringList.Create;
  inherited Create(CreateSuspended);
end;


Это сообщение отредактировал(а) uwannadie - 15.6.2010, 18:28
--------------------
PM MAIL   Вверх
uwannadie
Дата 15.6.2010, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

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



решил вроде проблему
надо было заменить
Код

procedure TWorkThread.SetYears(Value: TStringList);
begin
  pYears.Assign(Value);
end;

на
Код

procedure TWorkThread.SetYears(Value: TStringList);
begin
  pYears := Value;
end;

--------------------
PM MAIL   Вверх
RomanEEP
Дата 16.6.2010, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а вот так делать ни в коем случае нельзя. Переменная years останется в одном экземпляре и при по пытке изменить её содержимое из разных потов вылет обеспечен
PM MAIL   Вверх
Mikel
Дата 16.6.2010, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

procedure TWorkThread.SetYears(Value: TStringList);
begin
  pYears.Clear;
  pYears.AddStrings(Value);
end;



--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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