Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизПомогите пожалуйста с потоками! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c