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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2013, 13:08   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 263
По умолчанию Проблемы с передачей параметров в поток через TStringList

Добрый день. Есть вариант передачи параметров через string

Код:
unit Unit1;
var
  Form1: TForm1;
implementation
{$R *.dfm}
uses uLoadPage, uGlobalVar;
(*-----Запуск процесса многопотокой закачки страниц*)
procedure TForm1.Button6Click(Sender: TObject);
var
StrLst:TStringList;
Str:string;
begin
  StrLst:=TStringList.Create;
    StrLst.Text:=Memo2.Text; (*Передаем строки с УРЛ в Перем(аналог части Арр)*)
    Str:=StrLst.Text; (*переносим Список в Строка*)
    StartLoadTHreads(Str); (*Вызов ПРОЦ по запуску потоков закачки страниц*)
  FreeAndNil(StrLst);
end;
++++++++++++++++++++++++++++++++++++++
unit uLoadPage;
interface
uses Classes, Generics.Collections, SysUtils;
Procedure StartLoadTHreads(ListOfUrls:string);

implementation
uses uGlobalVar, uStartTHreadLoader, uThreadLoader;
(*  03.01.2013  Процедура запуска загрузки страниц в потоке*)
Procedure StartLoadTHreads(ListOfUrls:string);
var THread:TStartTHreadLoader;
begin
  THread:=TStartTHreadLoader.Create;
  THread.UrlList:=ListOfUrls; (*передача списка УРЛ в поток*)
  THread.Start;
end;
++++++++++++++++++++++++++++++++++++++
unit uStartTHreadLoader;
interface
  uses Classes, SyncObjs, SysUtils, Generics.Collections;
type
  TStartTHreadLoader = class(TThread)
    private
      FUrlList:string;
    protected
      procedure Execute; override;
      Procedure BeginLoadTHreads(StrListOfUrls:TStringList);
    public
      constructor Create;
      destructor Destroy; override;
      property UrlList:string read FUrlList write FUrlList;
  end;

implementation
uses Unit1, uLoadPage, uGlobalVar;

constructor TStartTHreadLoader.Create;
begin
  inherited Create(True); (*Поток создаем в состоянии «Приостановлен»*)
  FreeOnTerminate := True; (* Поток освободит ресурсы при окончании работы*)
  Self.Priority := tpNormal;
end;

destructor TStartTHreadLoader.Destroy;
begin
  inherited Destroy; (*уточнить, точно это нужно?*)
end;

procedure TStartTHreadLoader.Execute;
var StrLst:TStringList;
begin
  StrLst:=TStringList.Create;
  StrLst.Text:=UrlList; (*восстановление списка из строки*)
    try
      BeginLoadTHreads(StrLst); (*передача спика с УРЛ в ПРОЦ*)
    finally
      FreeAndNil(StrLst);
    end;
end;

Procedure TStartTHreadLoader.BeginLoadTHreads(StrListOfUrls:TStringList);
begin
  //тут много всего, но все работает
end;
end.
+++++++++++++++++++++++++++++++++++
в общем все работает, но приходится вначале СПИСОК переместить в строку, затем, в TStartTHreadLoader.Execute все назад возвращать.
Внимание!! Вопрос: можно ли обойтись без усложнения? без использования string. и как именно это сделать
вообще пробовал вместо string использовать TStringList, но почемуто туда не перемещались данные(строки) ПЕРЕМ всегда была пустой. какой то косяк от то что TStringList объект.
Pcrepair вне форума Ответить с цитированием
Старый 04.01.2013, 13:34   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
type
  TStartTHreadLoader = class(TThread)
    private
      FUrlList: TStringList;
    protected
      procedure Execute; override;
      Procedure BeginLoadTHreads(StrListOfUrls:TStringList);
    public
      constructor Create;
      destructor Destroy; override;
      property UrlList: TStringList read FUrlList write FUrlList;
  end;

Procedure StartLoadTHreads(ListOfUrls: TStringList);
var THread:TStartTHreadLoader;
begin
  THread:=TStartTHreadLoader.Create;
  THread.UrlList.Assign(ListOfUrls);
  THread.Start;
end;

constructor TStartTHreadLoader.Create;
begin
  inherited Create(True); (*Поток создаем в состоянии «Приостановлен»*)
  FUrlList:=TStringList.Create;
  FreeOnTerminate := True; (* Поток освободит ресурсы при окончании работы*)
  Self.Priority := tpNormal;
end;

destructor TStartTHreadLoader.Destroy;
begin
  FUrlList.Free;
  inherited Destroy;
end;
Для write свойства UrlList лучше конечно процедуру сделать или вообще сделать закрытым для обновления
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 04.01.2013 в 14:52.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с передачей праведный HTML и CSS 4 10.05.2012 11:59
Вопрос с передачей параметров в С swooppy Помощь студентам 0 09.05.2012 08:47
Ассемблер. Лаба по процедурам с передачей параметров через стек Poprigun777 Помощь студентам 0 14.03.2011 19:13
проблема с передачей параметров Mira-girl Общие вопросы по Java, Java SE, Kotlin 2 22.11.2010 23:59