Muharrem bey merhaba ,
Tarif ettiğiniz iş için en doğru senkronizasyon yapısısının SEMAPHORE olacağını düşünüyorum, özet yapı olarak, Semaphore u bir thread odası gibi düşünün içeride aynı anda çalıştırılacak thread sayısını belirliyorsunuz örn 10 , biten iş parçacığı yerine bekleyen yenisini alıp işletiyor. Özel bir tecrübem olmadığı için kod paylaşımıyorum ama anahtar kelime vermiş olayım.
iyi çalışmalar.
Düzeltme ;
Size bu mesajı gönderdikten sonra Semaphore ile ilgili @Tuğrul HELVACI beyin bana hazırladığı örneğe denk geldim , hemen paylaşıyorum. Örnekte 4 adet Thread var Semaphore 2 boyutuna sahip olarak oluşturulduğu için , 4 thread aynı anda Start ediliyor ancak beklendiği gibi aynı anda 2 si çalışacak şekilde senkronize oluyorlar.
Tarif ettiğiniz iş için en doğru senkronizasyon yapısısının SEMAPHORE olacağını düşünüyorum, özet yapı olarak, Semaphore u bir thread odası gibi düşünün içeride aynı anda çalıştırılacak thread sayısını belirliyorsunuz örn 10 , biten iş parçacığı yerine bekleyen yenisini alıp işletiyor. Özel bir tecrübem olmadığı için kod paylaşımıyorum ama anahtar kelime vermiş olayım.
iyi çalışmalar.
Düzeltme ;
Size bu mesajı gönderdikten sonra Semaphore ile ilgili @Tuğrul HELVACI beyin bana hazırladığı örneğe denk geldim , hemen paylaşıyorum. Örnekte 4 adet Thread var Semaphore 2 boyutuna sahip olarak oluşturulduğu için , 4 thread aynı anda Start ediliyor ancak beklendiği gibi aynı anda 2 si çalışacak şekilde senkronize oluyorlar.
unit uTest;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
SyncObjs,
CodeSiteLogging, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
ASemaphore : TSemaphore;
public
{ Public declarations }
end;
var
Form1: TForm1;
A,B,C,D,E : TThread;
implementation
uses
System.Diagnostics;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ASemaphore := TSemaphore.Create(nil, 2, 2, '');
A :=
TThread.CreateAnonymousThread(
procedure
begin
TThread.CurrentThread.FreeOnTerminate := false;
CodeSite.Send('Thread A Created and running');
WaitForSingleObject(ASemaphore.Handle, INFINITE);
Sleep(5000);
ASemaphore.Release(1);
CodeSite.Send('Thread A Exiting');
end
);
B :=
TThread.CreateAnonymousThread(
procedure
begin
CodeSite.Send('Thread B Created and running');
WaitForSingleObject(ASemaphore.Handle, INFINITE);
Sleep(5000);
ASemaphore.Release(1);
CodeSite.Send('Thread B Exiting');
end
);
C:=
TThread.CreateAnonymousThread(
procedure
begin
CodeSite.Send('Thread C Created and running');
WaitForSingleObject(ASemaphore.Handle, INFINITE);
Sleep(5000);
ASemaphore.Release(1);
CodeSite.Send('Thread C Exiting');
end
);
D:=
TThread.CreateAnonymousThread(
procedure
begin
CodeSite.Send('Thread D Created and running');
WaitForSingleObject(ASemaphore.Handle, INFINITE);
Sleep(5000);
ASemaphore.Release(1);
CodeSite.Send('Thread D Exiting');
end
);
A.Start;
B.Start;
C.Start;
D.Start;
end;
end.

