У меня есть класс TThread, который может работать независимо и завершается и освобождается после его завершения. Я считал прекращение, и все работает. Проблема в том, что я хотел бы добавить функцию, которую пользователь может выбрать и выбрать, сколько SYNCHRONOUS потоков должно быть активным одновременно. Примером может служить:Несколько экземпляров TThread
- Программа должна выполнять 100 полных задач!
- Пользователь выбирает 3 Темы должны работать одновременно, чтобы выполнить все задачи.
Первый шаг, который я сделал, - создать 3 экземпляра моего класса TThread и возобновить их в цикле for. Так работает 3 потока. После того, как первый поток будет завершен (или завершен), необходимо создать и возобновить новый новый экземпляр.
Я застрял в этом вопросе, и мне интересно, как я это понимаю. Любой совет будет полезен.
Edit: Некоторые Код
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread = class (TThread)
public
procedure Execute; override;
end;
var
Form1 : TForm1;
Threads : Integer = 3;
TotalTasks : Integer = 100;
implementation
{$R *.dfm}
procedure TMyThread.Execute;
begin
// some work...
sleep (2000 + random (5000));
end;
function DummyThread (p : pointer) : Integer; stdcall;
var
NewInstanceOfTMyThread : TMyThread;
I : Integer;
begin
for I := 1 to Threads do begin
with TMyThread.Create (TRUE) do begin
resume;
end;
end;
// Here should be code to detect if a new thread has to be started, etc.
end;
// We start the task to start the tasks...
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadID : DWORD;
begin
CloseHandle (CreateThread(NIL, 0, @DummyThread, NIL, 0, ThreadID));
end;
end.
Есть много способов обработки, а не самозавершающиеся потоки, которые будут получать новую работу, обрабатывать в threadmanager, обрабатывая OnTerminate .... http://stackoverflow.com/q/9025022/1699210 – bummi
Появляется делайте это неправильно. Вам нужен пул потоков и список задач. Потоки потребляют задачи до тех пор, пока не останется никаких задач. –
Обратите внимание, что решение в комментарии @DavidHeffernan. Это безопаснее и эффективнее, чем любая попытка управлять потоками, постоянно создавая/завершая/освобождая их. Создайте свои потоки X ONCE и передайте очередь производителей-потребителей в ctor. Если вам нужны потоки X + 1, просто создайте еще один. Если вы хотите потоки X-1, поставите в очередь одну задачу «яд-таблетка», которая инструктирует приемный поток прекратить работу. Другие решения ошибочны ... «очень сложно» получить право. –