Показать сообщение отдельно
  #8  
Старый 19.12.2018, 18:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не совсем так.
Пусть будет простой пример.
Поток:
Код:
type
  TWorkerThread = class(TThread)
    FTaskQueue : TStringList;
    procedure Execute; override;
    constructor Create(CreateSuspended : Boolean; TaskQueue : TStringList);
   end;

// Критическую секцию перенесли в интерфейс, будем ее использовать
// из главной формы
var
  cs : TCriticalSection; // ну как в прошлом примере - надо создать ее

implementation

procedure TWorkerThread.Execute;
var
  S : String;
begin
  While not Terminated Do
    Begin
      S := '';
      cs.Enter;
      Try
         If FTaskQueue.Count > 0 Then
           Begin
              S := FTaskQueue[0];
              FTaskQueue.Delete(0);
           End;
      Finally
         cs.Leave;
      End;      
    If S <> '' 
      Then ProcessUrl(S) // обрабатываем урл, метод не писал...
      Else Sleep(1000)
    End;
end;

constructor TWorkerThread.Create(CreateSuspended : Boolean; TaskQueue : TStringList);
begin
  If not Assigned(TaskQueue) 
    Then Raise Exception.Create('Не передана очередь заданий.');
  inherited Create(CreateSuspended);
  FTaskQueue := TaskQueue;
  FreeOnTerminate := True;
end;

В главной форме.
Код:
type
  TMainForm = class(TForm)
  ...
    FThreads : Array [1..10] Of TThread;
    FTaskQueue : TStringList;
  end;

uses
  
// На создание формы
procedure TMainForm.FormCreate(Sender : TObject);
var
  I : Integer;
begin
  FTaskThread := TStringList.Create;
  For I := Low(FThreads) To High(FThreads) Do
    FThreads[i] := TWorkerThread.Create(False,FTaskThread);
end;
    
// На уничтожение формы, надо удалить потоки
procedure TMainForm.FormDestroy(Sender : TObject);
var
  I : Integer;
begin
  For I := Low(FThreads) To High(FThreads) Do
    Begin
      FThreads[i].Terminate;
      FThreads[i].WaitFor;
    End;
  FThreadQueue.Free;
end;

// Где-то добавляется задание. Здесь для примера - по нажатию кнопки
// из Edit1.
procedure TMainForm.Button1Click(Sender : TObject);
begin
  cs.Enter; // входим в критическую секцию, которую используют и потоки для синхронизации
  Try
     FTaskQueue.Add(Edit1.Text);
  Finally
    cs.Leave;
   End;
end;

Ну, как-то так.
Ответить с цитированием