Показать сообщение отдельно
  #3  
Старый 01.02.2012, 09:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от syserg
Я хочу устанавливать количество одновременно работающих потоков, например 8, а записей пусть 100.
Как мне это верно организовать?
используй семафоры Semaphore Objects (добавить всего 4 функции):
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TTestThread = class(TThread)
  private
    FNum: Integer;
    procedure SynchAdd();
    procedure SynchDel();
  protected
    procedure Execute; override;
  public
    constructor Create(ANum: Integer);
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  InitialCount = 8;

var
  Form1: TForm1;
  hSemaphore: THandle;

implementation

{$R *.dfm}

{ TTestThread }

constructor TTestThread.Create(ANum: Integer);
begin
  inherited Create(True);
  FreeOnTerminate:=True;
  FNum:=ANum;
  Resume;
end;

procedure TTestThread.Execute;
begin
  WaitForSingleObject(hSemaphore, INFINITE);
  Synchronize(SynchAdd);
  Sleep(100+Random(100));
  Synchronize(SynchDel);
  ReleaseSemaphore(hSemaphore, 1, nil);
end;

procedure TTestThread.SynchAdd;
begin
  Form1.Tag:=Form1.Tag+1;
  Form1.Label1.Caption:=IntToStr(Form1.Tag);
end;

procedure TTestThread.SynchDel;
begin
  Form1.Tag:=Form1.Tag-1;
  Form1.Label1.Caption:=IntToStr(Form1.Tag);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:=1 to 100 do TTestThread.Create(i);
end;

initialization
  hSemaphore:=CreateSemaphore(nil, InitialCount, InitialCount, nil);

finalization
  CloseHandle(hSemaphore);

end.
основной код потока должен выполняться между WaitForSingleObject и ReleaseSemaphore. WaitForSingleObject будет ждать сигнала разрешения от семафора для которого установлено MaximumCount = 8.
http://data.cod.ru/141194
__________________
Пишу программы за еду.
__________________
Ответить с цитированием