2013-05-17 6 views
1

У меня есть класс 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. 
+1

Есть много способов обработки, а не самозавершающиеся потоки, которые будут получать новую работу, обрабатывать в threadmanager, обрабатывая OnTerminate .... http://stackoverflow.com/q/9025022/1699210 – bummi

+4

Появляется делайте это неправильно. Вам нужен пул потоков и список задач. Потоки потребляют задачи до тех пор, пока не останется никаких задач. –

+4

Обратите внимание, что решение в комментарии @DavidHeffernan. Это безопаснее и эффективнее, чем любая попытка управлять потоками, постоянно создавая/завершая/освобождая их. Создайте свои потоки X ONCE и передайте очередь производителей-потребителей в ctor. Если вам нужны потоки X + 1, просто создайте еще один. Если вы хотите потоки X-1, поставите в очередь одну задачу «яд-таблетка», которая инструктирует приемный поток прекратить работу. Другие решения ошибочны ... «очень сложно» получить право. –

ответ

3

Вы можете написать обработчик для OnTerminate случае TThread. Обработчик должен начать/возобновить новый поток.

Или у вас может быть 3 потока, которые постоянно работают и выполняют задачи из очереди (просто позаботьтесь о синхронизации доступа к очереди).

+0

Но как экземпляр класса TThread знает, сколько потоков работает и когда остановиться? –

+1

Экземпляр TThread не должен знать о том, сколько потоков работает. Это задача для другого объекта: кто-то (некоторый объект-менеджер) должен создавать все потоки и назначать для них задачи. В простейшем случае вы можете просто иметь список потоков, ожидающих возобновления (или список задач, ожидающих обработки), тогда готовый поток просто берет следующий поток/задачу из списка и возобновляет/обрабатывает его. Список должен быть общим для всех потоков. – Inspired

+0

Я думал о дополнительном потоке, который проверяет все потоки, если он все еще работает или сейчас, но как мне это сделать с тем же классом Varhar TThread (только 1). См. Мой код. –

Смежные вопросы