
01.02.2012, 09:59
|
 |
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
__________________
Пишу программы за еду.
__________________
|