Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Помогите пожалуйста с потоками!   Найти похожие ветки 

 
noname:) ©   (2004-11-04 20:08) [0]

Спасибо за Ваше внимание! Помогите с сылкой на исходник, статью или подкинте совет как сделать многопоточное приложение с очередью потоков. Например нужно выполнить 2 тысячи какихто однотипных опираций, например циклов, но чтобы одновременно не создавать столько потоков поставить их в очередь(выполнять их пачьками), а максимальное количество одновременно выполняемых потоков ограничить.
Заранее благодарен за помощь!


 
Poirot ©   (2004-11-04 20:14) [1]

CreateSemaphore + F1


 
noname:) ©   (2004-11-04 20:32) [2]

Я конечно извеняюсь, но можно ли поподробние. Ведь в этом то и дело что я неумею пользоватся семафорами:) Хотелось бы побольше узнать о приёмах работы с потоками(именно с управлением их очередью)


 
ALex B.   (2004-11-05 00:36) [3]

Я конечно извеняюсь, но можно ли поподробние. Ведь в этом то и дело что я неумею пользоватся семафорами:) Хотелось бы побольше узнать о приёмах работы с потоками(именно с управлением их очередью)


 
GanibalLector ©   (2004-11-05 02:04) [4]

> Хотелось бы побольше узнать о приёмах работы с потоками(именно с управлением их очередью)

Читаем дядьку Рихтера!


 
Defunct ©   (2004-11-05 03:10) [5]

> 2 тысячи какихто однотипных опираций,
> выполнять их пачьками
> Я конечно извеняюсь, но можно ли поподробние.

не майтесь чипухой, создайте один поток и выполняйте в нем все операции.


 
Digitman ©   (2004-11-05 08:22) [6]


> noname


в качестве наглядного примера можно посмотреть, как менеджер трэд-пула реализован в пакете Indy v9 (компоненты IdThreadMgrDefault, IdThreadMgrPool)

упрощенная реализация трэд-мэнеджера есть и в составе станд.класса TServerWinSocket в модуле scktcomp.pas, ее тоже можно рассмотреть как пример


 
noname:) ©   (2004-11-05 12:02) [7]

Чтото вроде этого??

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,Dialogs, Buttons, StdCtrls,winsock,sockets, icmp,commctrl;

const
 MAX_THREAD_COUNT = 32;
type
 TLimitedThread = class(TThread)
   procedure Execute; override;
   private
   b:integer; procedure updatememo(nm:string);
   public  
   constructor Create(CreateSuspennded: Boolean; const u: integer);
 end;
type
 TForm1 = class(TForm)
   SpeedButton1: TSpeedButton;
   Memo1: TMemo;
   Ping1: TPing;
   procedure SpeedButton1Click(Sender: TObject);

   procedure Ping1Ping(sender: TObject; status, ip, roundtime: Integer);
   procedure FormCreate(Sender: TObject);
 private  
   { Private declarations }
 public  function LookupHostName(const ipaddr: string): string;
 
   { Public declarations }
 end;

var
 Form1: TForm1;
 Semaphore: THandle;
 threads:integer;
implementation

{$R *.dfm}
constructor TLimitedThread.Create(CreateSuspennded: Boolean;
           const u:integer);
begin
threads:=threads+1;
Form1.Caption := inttostr(threads);
 inherited Create(CreateSuspennded);
 b := u;

end;

function getstrip(const ip:longint):string;
begin
       Result := IntToStr(FOURTH_IPADDRESS(ip))+
     "." + IntToStr(THIRD_IPADDRESS(ip)) +
     "." + IntToStr(SECOND_IPADDRESS(ip)) +
     "." + IntToStr(FIRST_IPADDRESS(ip));
end;
procedure TLimitedThread.Execute;
var x,i:integer; name:string;
begin

 WaitForSingleObject(Semaphore, INFINITE);

 name := Form1.LookupHostName(getstrip(b));
 
(updatememo(name));
 threads:=threads-1;
 Form1.Caption := inttostr(threads);
 ReleaseSemaphore(Semaphore, 1, NIL);
end;
procedure TLimitedThread.updatememo(nm:string);
begin
Form1.Memo1.lines.add(nm);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var f:integer;
begin
for f:=3 to 100 do begin ping1.Hostname := "192.168.0." + inttostr(f);
ping1.action
end;
end;
function TForm1.LookupHostName(const ipaddr: string): string;
var
 h: PHostEnt;
 addr: TSockAddr;
begin
 Result := "";
 addr.sin_addr.s_addr := inet_addr(pchar(ipaddr));
 if addr.sin_addr.s_addr <> INADDR_NONE then
 begin
   h := gethostbyaddr(@addr.sin_addr.s_addr, sizeof(addr), AF_INET);
   if h <> nil then
     Result := h^.h_name;
 end;
end;

procedure TForm1.Ping1Ping(sender: TObject; status, ip,
 roundtime: Integer);
begin
case status of
   ip_success:

TLimitedThread.Create(false,ip);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin

end;

initialization
 Semaphore := CreateSemaphore(NIL, MAX_THREAD_COUNT,
   MAX_THREAD_COUNT, NIL);

finalization
 CloseHandle(Semaphore);
end.



Страницы: 1 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
14-1099718506
Александр1
2004-11-06 08:21
2004.11.21
NTFS


1-1100091483
Ditrix
2004-11-10 15:58
2004.11.21
хранение GUI в BLOB полях


4-1097650089
MegaVolt
2004-10-13 10:48
2004.11.21
Как освободить память из под файла отображенного в память?


14-1099487352
TUser
2004-11-03 16:09
2004.11.21
Кто знает фотошоп?


6-1094809027
Samael6
2004-09-10 13:37
2004.11.21
MS Exchange Server чтение базы данных