ã¿ã€ãã«ã§ã«ããŒãããŠãããããã¯ã¯éåžžã«åºç¯å²ã§ãã 以äžã«æžãããŠããã®ã¯æ°·å±±ã®äžè§ããã§ã¯ãªãããããã®æ°·å±±ãæµ®ãã¶æµ·æ10,000ã¡ãŒãã«ã®é«åºŠã§ã®é£è¡ã§ãã ãªããã®ãããªèšäºãæžãã®ã§ããïŒ ããããé·ãéå©çšå¯èœã§ãã£ãããäœããã®çç±ã§å€ããæããŠæ¥ãããããå±ã§ããåºãæ©äŒã«æ³šæãæãããã«ã
ãã«ãã¡ã€ãéžã¶çç±
ç§ã¯éåžžã«é·ãéDelphiã§ããã°ã©ãã³ã°ããŠããŸããããããã楜ããã®ããããŸããã ããã¯å€ãã®ç¹ã§çŽ æŽââãããèšèªã§ãã ãã®ç¬èªæ§ã¯ãåæã«ãããŒããŠã§ã¢ã«è¿ãããŸãŸã§ãä»»æã®é«ã¬ãã«ã®ã³ãŒããäœæã§ãããšããäºå®ã«ãããŸãã åºåã¯ãJavaãŸãã¯.Netä»®æ³ãã·ã³ã®ã³ãŒãã§ã¯ãªãããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã§ãã åæã«ãDelphièšèªã¯éåžžã«ã·ã³ãã«ã§ç°¡æœã§ãã³ãŒãã¯èªã¿ããããç解ãããããããCãŸãã¯C ++ã®ã³ãŒãã«ã€ããŠã¯èšããŸããïŒCã®éçºè ã«æ¬æãè¡šããŸãããããã¯åãªãç¿æ £ã®åé¡ã§ãïŒã
çŸæç¹ã§ã¯ãDelphiã¯ä»¥åã®äººæ°ã倱ã£ãŠããŸãã ããã¯ããããã2000幎代ã«ãã®è£œåãéçºè ã«ãã£ãŠæ°å¹Žéã»ãšãã©æŸæ£ããããã®çµæããã°ããã®éãéçºç°å¢ã®ç«¶äºã®æ¿ãã競äºããè±èœãããšããäºå®ã®ããã«èµ·ãããŸããã å®éã2002幎ã«ããŒã©ã³ãã«ãã£ãŠãªãªãŒã¹ãããDelphi 7ã®åŸãå€ããå°ãªããå®å®ãã補åã2007幎ã«ã®ã¿ç»å ŽããŸããã ããã¯ãããŒã©ã³ãã®åäŒç€Ÿã§ããCodeGearããªãªãŒã¹ããCodeGear Delphi 2007ã§ããã Delphi 7ãšDelphi 2007ã®éã®ãã¹ãŠã®ããŒãžã§ã³ã¯ãå®éã«ã¯äœ¿çšã§ããŸããã§ããã 2008幎ãBorlandã¯CodeGearéšéãEmbarcadero Technologiesã«å£²åŽããŸãããEmbarcaderoTechnologiesã¯ïŒåœŒå¥³ã«æè¬ããŸãïŒïŒããã«ã圌女ãæã«å ¥ãããã®ãææ°ã®é«å質ãªéçºç°å¢ã«å€ãå§ããŸããã å·çæç¹ã§ã®Delphiã®çŸåšã®ããŒãžã§ã³ã¯ã2011幎9æã«ãªãªãŒã¹ãããEmbarcadero Delphi XE2ã§ãã ææ°ã®DelphiããŒãžã§ã³ã¯ããªãé«å質ã§ããããããã®éçºç°å¢ã¯å€±ãããããžã·ã§ã³ãåŸã ã«åãæ»ããŠããŸãã
ãªããã«ãã¹ã¬ãããå¿ èŠãªã®ã§ããïŒ
人ã ã¯ãã³ã³ãã¥ãŒã¿ãŒäžã§åæã«ããã€ãã®ã¿ã¹ã¯ãå®è¡ããããšèããŠããŸããã ããã¯ãã«ãã¿ã¹ã¯ãšåŒã°ããŸãã ãã«ãã¿ã¹ã¯ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠå®è£ ãããŸãã ãã ããOSãè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãåæã«å®è¡ã§ããå ŽåãäžåºŠã«è€æ°ã®ã¿ã¹ã¯ãå®è¡ããããã«ãå éšã®1ã€ã®ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããªãããã«ããŸãããã ããšãã°ã倧éã®ãã¡ã€ã«ã®ãªã¹ããã¢ãŒã«ã€ãããå Žåãã¢ãŒã«ã€ãã¯ãã¡ã¢ãªå ã®æ¬¡ã®ãã¡ã€ã«ãåæã«èªã¿åããçŸåšã®èªã¿åããã¢ãŒã«ã€ããããã£ã¹ã¯äžã®åºåãã¡ã€ã«ã«çµæãæžã蟌ãããšãã§ããŸãã ã€ãŸã 1ã€ã®ã¹ããªãŒã ã®åãã¡ã€ã«ã§ãèªã¿åãã->ãã¢ãŒã«ã€ãã->ããã£ã¹ã¯ã«çµæãæžã蟌ããã®ä»£ããã«ã3ã€ã®ã¹ããªãŒã ãéå§ã§ããŸãã1ã€ã¯ãã¡ã€ã«ãã¡ã¢ãªã«èªã¿åãã2ã€ç®ã®ã¹ããªãŒã ã¯ã¢ãŒã«ã€ããããŸãã 3çªç®ã¯ãã£ã¹ã¯ã«ä¿åããããšã§ãã å¥ã®äŸã¯ãããã€ãã®åªå 床ã®äœãã¿ã¹ã¯ã®ããã¯ã°ã©ãŠã³ãã§ã®ããã©ãŒãã³ã¹ã§ããããšãã°ãããã¹ããšãã£ã¿ãŒã§éãããã¡ã€ã«ã®ããã¯ã¢ããã³ããŒãããã¯ã°ã©ãŠã³ãã§ä¿åããŸãã
ããã»ããµã90幎代ãã2000幎代åæãšåãããŒã¹ã§ã¯ããã¯é床ãäžãç¶ããå Žåããã«ãã¹ã¬ããã«ç ©ãããããåŸæ¥ã®ã·ã³ã°ã«ã¹ã¬ããã³ãŒããæžãç¶ããå¿ èŠã¯ãããŸããã ãã ããè¿å¹Žãããã»ããµã¯1ã€ã®ã³ã¢ã®é床ãç©æ¥µçã«äžããããšããããŸãããããããã®ã³ã¢èªäœã®æ°ãå¢ããå§ããŸããã ææ°ã®ããã»ããµã®å¯èœæ§ã100ïŒ äœ¿çšããã«ã¯ããã«ãã¹ã¬ãããäžå¯æ¬ ã§ãã
ãã«ãã¹ã¬ããã³ãŒããæžãã®ãé£ããã®ã¯ãªãã§ããïŒ
1ïŒééããç¯ããããã
è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã¥ãŒã¿ãŒäžã§åæã«å®è¡ãããŠããå Žåãåããã»ã¹ã®ã¢ãã¬ã¹ç©ºéïŒã¡ã¢ãªïŒã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠä»ã®ããã»ã¹ãã確å®ã«åé¢ãããä»ã®èª°ãã®ã¢ãã¬ã¹ç©ºéã«å ¥ãããšã¯éåžžã«å°é£ã§ãã å察ã«ãåãããã»ã¹å ã®ã¹ã¬ããã§ã¯ããããã¯ãã¹ãŠããã»ã¹ã®å ±éã¢ââãã¬ã¹ç©ºéã§åäœããä»»æã«å€æŽã§ããŸãã ãã®ããããã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¡ã¢ãªä¿è·ãšã¹ã¬ããåæãåå¥ã«å®è£ ããå¿ èŠããããŸããããã«ãããæ¯èŒçè€éã§ãããšåæã«ãã€ããŒãã³ãŒããéã°ãªãããã«ããå¿ èŠãçããŸãã ãã®ã³ãŒãã¯ãããã€ã©ãŒãã¬ãŒããïŒãã©ã€ãã³ïŒãšåŒã°ããŸãããã³ã調çããåã«ããŸããã³ã調çããå¿ èŠãããããã§ãã ãã«ãã¹ã¬ããã³ã³ãã¥ãŒãã£ã³ã°ã®éçºã劚ãããéæšæºããã€ã©ãŒãã¬ãŒãã³ãŒããèšè¿°ããå¿ èŠããããŸãã ã¹ã¬ãããåæããããã®ç¹å¥ãªã¡ã«ããºã ãå€æ°ãããŸããã€ã³ã¿ãŒããã¯ãããããã»ããµåœä»€ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã åæã®ãªããžã§ã¯ãïŒã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ããã¥ãŒããã¯ã¹ãã»ããã©ãã€ãã³ããªã©ïŒãã¹ãã³ããã¯ãªã©ã
2ïŒãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã¯åæãå°é£ã§ãã
ãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã®é£ç¹ã®1ã€ã¯ãç¹å®ã®ã¡ãœãããç°ãªãã¹ã¬ããããåŒã³åºãïŒãŸãã¯åŒã³åºãïŒããšãã§ãããã©ããããã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã§èŠããšèŠèŠçã«æ確ã§ãªãããšã§ãã ã€ãŸã ç°ãªãã¹ã¬ããããåŒã³åºãããšãã§ããã¡ãœãããšåŒã³åºããªãã¡ãœãããèŠããŠããå¿ èŠããããŸãã 絶察ã«ãã¹ãŠã®ã¡ãœãããã¹ã¬ããã»ãŒãã«ããããšã¯ãªãã·ã§ã³ã§ã¯ãªããããè€æ°ã®ã¹ã¬ããããã¹ã¬ããã»ãŒãã§ãªãã¡ãœãããåŒã³åºããšãåžžã«ãšã©ãŒãçºçããå¯èœæ§ããããŸãã
3ïŒãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã¯ãããã°ãå°é£ã§ãã
ãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¹ã¬ããã®ç¹å®ã®ç¶æ ã䞊è¡ããŠå®è¡ãããŠããå ŽåïŒååãšããŠãäžé£ã®ã³ãã³ããç°ãªãã¹ã¬ããã§å®è¡ãããå ŽåïŒãå€ãã®ãšã©ãŒãçºçããå¯èœæ§ããããŸãã èå³æ·±ãäŸãããã§èª¬æããŸãïŒhttp://www.thedelphigeek.com/2011/08/multithreading-is-hard.htmlïŒã ãã®ãããªç¶æ³ã人çºçã«äœæããããšã¯ãå€ãã®å Žåéåžžã«é£ãããã»ãšãã©äžå¯èœã§ãã ããã«ãDelphiã«ã¯ãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ããããã°ããããã®ããŒã«ã¯ããŸãå€ããããŸããããVisual Studioã¯ãã®ç¹ã§æ確ãªãªãŒããŒã§ãã
4ïŒãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ããšã©ãŒãåŠçããããšã¯å°é£ã§ãã
ã¢ããªã±ãŒã·ã§ã³ã«ã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãããå Žåã1ã€ã®ã¹ã¬ããã®ã¿ããŠãŒã¶ãŒãšå¯Ÿè©±ã§ããŸãã éåžžãã¢ããªã±ãŒã·ã§ã³ã§äœããã®ãšã©ãŒãçºçããå Žåãã¢ããªã±ãŒã·ã§ã³å ã§ãšã©ãŒãåŠçãããããŠãŒã¶ãŒã«ã¡ãã»ãŒãžã衚瀺ããŸãã è¿œå ã®ã¹ããªãŒã ã§ãšã©ãŒãçºçããå Žåããããã«ããŠãŒã¶ãŒã«äœãèšããŸããã ãããã£ãŠãã¡ã€ã³ã¹ããªãŒã ãšåæãããŸã§è¿œå ã®ã¹ããªãŒã ã§çºçãããšã©ãŒãä¿åããŠããããŠãŒã¶ãŒã«çºè¡ããå¿ èŠããããŸãã ããã¯ãæ¯èŒçè€éã§ãããã«ããã³ãŒãæ§é ã«ã€ãªããå¯èœæ§ããããŸãã
ç§ã®äººçãå°ãç°¡çŽ åããæ¹æ³ã¯ãããŸããïŒ
OmniThreadLibrary ïŒç¥ããŠOTLïŒã玹ä»ããŸãã OmniThreadLibraryã¯ãDelphiã§ãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ã©ã€ãã©ãªã§ãã ãã®äœè ã§ããã¹ãããã¢ã®Primoz Gabrijelcicã¯ãDelphiã§ã®é·å¹Žã®ã¢ããªã±ãŒã·ã§ã³éçºçµéšãæã€åè¶ããå°é家ã§ãã OmniThreadLibraryã¯å®å šã«ç¡æã®ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã§ãã çŸæç¹ã§ã¯ãã©ã€ãã©ãªã¯ãã§ã«ããªãæçãã段éã«ãããæ·±å»ãªãããžã§ã¯ãã§ã®äœ¿çšã«éåžžã«é©ããŠããŸãã
OTLæ å ±ã¯ã©ãã§å ¥æã§ããŸããïŒ
- ãã®ãã©ãŒã©ã ã§ã
- ã©ã€ãã©ãªã®äœæè ã®ããã° ã
- GoogleCode ã®ãããžã§ã¯ãããŒãž ã
OTLãæäŸããæ©èœã¯äœã§ããïŒ
ãã®ã©ã€ãã©ãªã«ã¯ãWinAPIã¬ãã«ã§ã¹ã¬ãããäœæ/解æŸ/åæããããã»ã¹ã®è©³çŽ°ã«é²ãããšãªãããã«ãã¹ã¬ããã®ç®¡çãç°¡çŽ åã§ããäœã¬ãã«ããã³é«ã¬ãã«ã®ã¯ã©ã¹ãå«ãŸããŠããŸãã
ç¹ã«èå³æ·±ãã®ã¯ããã«ãã¹ã¬ãã管çãç°¡çŽ åããããã®é«ã¬ãã«ã®ããªããã£ãã§ãã ãããã¯ããœãŒã¹ã³ãŒãã®æ§é ãå®è³ªçã«å€æŽããããšãªããæ¢è£œã®ã·ã³ã°ã«ã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã«æ¯èŒçç°¡åã«çµ±åã§ãããšããç¹ã§æ³šç®ã«å€ããŸãã ãããã®ããªããã£ãã«ããããã«ãã¹ã¬ããã管çããããã®è£å©ã³ãŒãã§ã¯ãªããæçšãªã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«çŠç¹ãåœãŠããã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
äž»ãªé«ã¬ãã«ããªããã£ãã«ã¯ã Future ïŒéåæé¢æ°ïŒã Pipeline ïŒãã€ãã©ã€ã³ïŒã Join ïŒããã€ãã®ã¡ãœããã®äžŠååŒã³åºãïŒã ForkJoin ïŒäžŠååŠçã䌎ãååž°ïŒã Async ïŒéåæã¡ãœããïŒã ForEach ïŒäžŠåã«ãŒãïŒãå«ãŸããŸãã
ç§ã®æèŠã§ã¯ãæãèå³æ·±ãæçšãªããªããã£ãã¯FutureãšPipelineã§ãã ãããã䜿çšããããã«ãæ¢åã®ã³ãŒããã»ãšãã©æžãæããå¿ èŠã¯ãããŸããã
æªæ¥
ãã®ããªããã£ãã䜿çšãããšãéåæé¢æ°åŒã³åºããè¡ããé©åãªã¿ã€ãã³ã°ã§èšç®ãå®äºããã®ãåŸ ã£ãŠå®è¡çµæãååŸã§ããŸãã ãã®ããªããã£ãã䜿çšãããšãä»»æã®ããã·ãŒãžã£ãŸãã¯é¢æ°ã®åŒã³åºããç°¡åã«éåæã«å€æã§ããŸãã
次ã®ããã«ãªããŸãã
uses OtlParallel; ... procedure TestFuture; var vFuture: IOmniFuture<integer>; begin // vFuture := Parallel.Future<integer>( function: integer var i: integer; begin Result := 0; for i := 1 to 100000 do Result := Result + i; end ); // - ( ( , , ) // , ShowMessage(IntToStr(vFuture.Value)); end;
ã¡ã€ã³ã¹ããªãŒã ãšè¿œå ã¹ããªãŒã ã®åæã®ç¬éã§ããvFuture.Valueã®åŒã³åºãã§ããããšã«æ³šæããŠãã ããã Valueã«æ»ããŸã§ãå¥ã®ã¹ã¬ããã®ç¶æ ã«ã€ããŠã¯äœãç¥ããŸããã ValueãåŒã³åºããšããã«ãè¿œå ã®ã¹ã¬ããã§èšç®ãå®äºãããŸã§ã¡ã€ã³ã¹ã¬ãããäžæãããŸãã
å¿ èŠã«å¿ããŠãã¡ã€ã³ã¹ã¬ããã§çµæã®éããããã³ã°åŸ æ©ãå®è£ ã§ããŸãã
while not vFuture.IsDone do Application.ProcessMessages;
ãããã£ãŠãFutureããªããã£ãã䜿çšãããšãéåæçã«ã¿ã¹ã¯ãå®è¡ããããã§å¿ èŠãªãšãã«æ£ç¢ºã«çµæãã¡ã€ã³ã¹ã¬ããã«è¿ãããšãã§ããŸãã
ãã€ãã©ã€ã³
ãã€ãã©ã€ã³ïŒãã€ãã©ã€ã³ïŒã¯ãFutureãšæ¯ã¹ãŠã¯ããã«åŒ·åãªããªããã£ãã§ãã
å€ãã®èŠçŽ ã«å¯ŸããŠç¹å®ã®ã¢ã«ãŽãªãºã ãã«ãŒãã§å®è¡ãããããšãæ³åããŠãã ããã ããšãã°ããã£ã¬ã¯ããªå ã®ãã¡ã€ã«ã®äžéšã®åŠçãå®è¡ãããŸãã ã·ã³ã°ã«ã¹ã¬ããã®ããã°ã©ã ã¯ã次ã®ãã¡ã€ã«ãååŸããŠèªã¿åããããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããå€æŽããããã¡ã€ã«ããã£ã¹ã¯ã«ä¿åããŸãã ãã€ãã©ã€ã³ã䜿çšãããšãåæã¢ã«ãŽãªãºã ãã¹ããŒãžïŒèªã¿åããåŠçãä¿åïŒã«åå²ãããããã®ã¹ããŒãžã䞊åã¹ã¬ããã§å®è¡ã§ããŸãã æåã®æ®µéã§ã¯ãæåã®ã¹ããŒãžã®ã¿ãéå§ãããæåã®ãã¡ã€ã«ãèªã¿åããŸãã èªã¿åããå®äºãããšããã«ã2çªç®ã®ã¹ããŒãžãéå§ãããèªã¿åããã¡ã€ã«ãŸãã¯ãã®éšåã®åŠçãéå§ãããŸãïŒæåã®ã¹ããŒãžããã¡ã€ã«å šäœã§ã¯ãªãéšåçã«èªã¿åãå ŽåïŒã ãã®æç¹ã§ãæåã®ã¹ããŒãžã¯ãã§ã«2çªç®ã®ãã¡ã€ã«ã®èªã¿åããéå§ããŠããŸãã 2çªç®ã®ã¹ããŒãžãæåã®ãã¡ã€ã«ãåŠçãããšããã«ã3çªç®ã®ã¹ããŒãžãæ¥ç¶ããŠä¿åãéå§ããŸãã ãã®æç¹ã§ã3ã€ã®ã¹ããŒãžãã¹ãŠã䞊è¡ããŠåäœããç¶æ ã«ãªããŸãã
å®éã®ç掻ã«è¿ãPipelineã®äŸã¯ãèšäºãèªã¿ãããŠããŸãã®ã§ãPipelineã®äœ¿çšã説æããããã«ãOtlBookããã®çµ¶å¯ŸçãªåæäŸã®ã³ããŒã«å¶éããŸãïŒåã¡éããªãã§ãã ããïŒïŒã
uses OtlCommon, OtlCollections, OtlParallel; var sum: integer; begin sum := Parallel.Pipeline .Stage( procedure (const input, output: IOmniBlockingCollection) var i: integer; begin for i := 1 to 1000000 do output.Add(i); end) .Stage( procedure (const input: TOmniValue; var output: TOmniValue) begin output := input.AsInteger * 3; end) .Stage( procedure (const input, output: IOmniBlockingCollection) var sum: integer; value: TOmniValue; begin sum := 0; for value in input do Inc(sum, value); output.Add(sum); end) .Run.Output.Next; end;
ãã®äŸã§ã¯ãæåã®ã¹ããŒãžã§100äžåã®æ°å€ãçæããããããã1ã€ãã€æ¬¡ã®ã¹ããŒãžã«æž¡ãããŸãã 2çªç®ã®æ®µéã§ã¯ãåæ°å€ã«3ãæããŠã3çªç®ã®æ®µéã«é²ã¿ãŸãã 3çªç®ã®ã¹ãããã¯çµæãèŠçŽããåäžã®æ°å€ãè¿ããŸãã åã¹ããŒãžã¯ãç¬èªã®ã¹ã¬ããã§å®è¡ãããŸãã ããã«ãOtlã§ã¯ãåçŽãªä¿®é£Ÿå.NumTasksïŒNïŒã«ãããåã¹ããŒãžã§äœ¿çšããã¹ã¬ããã®æ°ïŒååã§ãªãå ŽåïŒãæå®ã§ããŸãã OTLã®æ©èœã¯éåžžã«å¹ åºããã®ã§ãã
ãã€ãã©ã€ã³ã¹ããŒãžéã®ããŒã¿äº€æããµããŒãããããã®åºæ¬ã¯ã©ã¹ã¯ãã¹ã¬ããã»ãŒããã¥ãŒã¯ã©ã¹-TOmniBlockingCollectionã§ãã ãã®ã¯ã©ã¹ã«ãããè€æ°ã®ã¹ã¬ãããåæã«ã¢ã€ãã ãè¿œå ããã³èªã¿åãããšãã§ããŸãã ã³ã¬ã¯ã·ã§ã³ã®é«éåã¯ãããªãããŒãªã¡ã¢ãªç®¡çãšãOSåæãªããžã§ã¯ãã«åºã¥ãããã¯ã§ã¯ãªããã¹ã¬ããã»ãŒãããã»ããµåœä»€ã«åºã¥ãããã¯ã®äœ¿çšã«ããå®çŸãããŸãã TOmniBlockingCollectionã¯ã©ã¹ã®å®è£ ã®è©³çŽ°ã«ã€ããŠã¯ã ãã¡ã ã ãã¡ã ã ãã¡ããã芧ãã ãã ã
ãããã«
äžèšã®äŸãèŠãŠãã人ã¯ããã¯ããç§ã¯ãã§ã«ãããèŠãŸããããšèšãã§ãããã å®éã.Net Framework 4ã®ã¿ã¹ã¯ãã©ã¬ã«ã©ã€ãã©ãªã«ã¯ãã»ãŒåãã¯ã©ã¹ãå«ãŸããŠããŸãã .Netãã·ã³å ã§ã®ã¹ã¬ããã®å®è¡æ¹æ³ãšãå®éã®ããã»ããµã§ã®ã¹ã¬ããã®å®è¡æ¹æ³ã«ã¯å€ãã®éãããããŸãã ãããã®éããèæ ®ããããšã¯ããã®èšäºã®ç¯å²å€ã§ãã ãã°ãããã©ã€ãã©ãªãšããããDelphiéçºè ã«æäŸããå¹ åºãå¯èœæ§ã«æ³šç®ãããã£ãã ãã§ãã ã©ã€ãã©ãªã«ã¯ãäœã¬ãã«ã¯ã©ã¹ãšé«ã¬ãã«ã¯ã©ã¹ã®äž¡æ¹ã®äœ¿çšã瀺ãå€æ°ã®äŸãå«ãŸããŠããããšã«æ³šæããŠãã ããã
ãã®ã©ã€ãã©ãªã®æç床ãšä¿¡é Œæ§ã«å¯Ÿããäžå®ãææããããã«ãç§ã¯ãïŒWebã§ã¯ãªãïŒè€éãªåçšãã«ããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã§Pipelineã䜿çšããããšã§ãåå¥ã®ã¹ããªãŒã ã§ã®ãã¡ã€ã«åŠçã«ãããã¯ã©ã€ã¢ã³ãäžã®ãã¡ã€ã«ã°ã«ãŒãã«å¯Ÿããæäœã®å®è¡æéãã»ãŒååã«ççž®ã§ãããšèšããŸãã¯ã©ã€ã¢ã³ããšãµãŒããŒãžã®è»¢éã ãããžã§ã¯ãã§Delphi + OmniThreadLibraryãã³ãã«ã䜿çšãããã©ããã¯ããªã次第ã§ã;ïŒ