19.12.2018, 18:37
|
Модератор
|
|
Регистрация: 17.04.2008
Сообщения: 8,018
Версия 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;
Ну, как-то так.
|