Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблемы с передачей параметров в поток через TStr


Автор: Pcrepair 4.1.2013, 12:17
Добрый день. Есть вариант передачи параметров через 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 объект.

Автор: Illusion Dolphin 4.1.2013, 22:58
Если делфи новая, то можно передавать как:
Код

      Items: TArray<string>;
     
      ...
     
      Items := Memo1.Lines.ToStringArray();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)