Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1099304380
Dimedrol
2004-11-01 13:19
2004.11.21
Как вытащить данные из "экзотического" CHAR/PCHAR ?


14-1099292280
SNV-Soft
2004-11-01 09:58
2004.11.21
ShareWare за бугор...


14-1099778899
Comp
2004-11-07 01:08
2004.11.21
Какой антивирус лучше?


1-1100093018
Pentium133
2004-11-10 16:23
2004.11.21
потомок TThread


1-1099780146
Змей
2004-11-07 01:29
2004.11.21
treeview





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский