2011-10-11 13 views
24

私は以前、Delphi XEの新しいマルチスレッドと、マルチスレッドを実装する方法のためにDelphiにいくつかの「ネイティブ」な問題があることについて議論してきました。そして、デフォルトのDelphiマルチスレッドを置き換えるためにいくつかの外部ライブラリを推奨していました。Delphi XEのマルチスレッドの新機能は何ですか?

Delphi XEのドキュメントと最も一般的なマルチスレッドライブラリを教えてください。 おかげ

+0

私は新しい機能の1つを思い出しました.Delphi XEでは、スレッドに名前を付けることができます。クール。他にもありますか? – Ampere

+6

'TThread.NameThreadForDebugging'がD2010に存在します。私は、Delphiに付属のスレッディングコードに深刻な問題があるとは思わない。最も人気があり、最高のスレッディングライブラリは[OmniThreadLibrary](http://otl.17slon.com/)ですが、@ gabrはあまりにも控えめなのでそう言いません。 –

+1

Delphiは、スレッド化の実装方法に「ネイティブの問題」はありません。私は2003年からTThreadに基づいたクラスを使用していますが、本当に面倒なことはありません。ただし、既存のサードパーティのスレッドフレームワークを使い始めるのは、とにかく手間を省くためです。 – Misha

答えて

7

私が新たに導入された機能のすべてがすでに覆われていたと信じています。

古典的なチュートリアルブックMartin Harvey. Multithreading - The Delphi Way.のアーカイブされたコピーは次のとおりです。寄稿したライブラリ(スレッドプールを除いて)が本当に必要でないことが分かります。あなたのために物事を簡素化しない、彼らはまた細かい制御からあなたを奪う。

+1

CC:[マルチスレッド - The Delphiの方法(Update:V 1.1)](http://cc.embarcadero.com/Item/14809)でも利用可能です。また、[マルチスレッド - 非同期通知ライブラリ(V 1.2)](http://cc.embarcadero.com/Item/21570) –

+0

@TOndrej、続編! :-)ありがとう! –

25

[あなたはスレッド名を設定することができます。TThread.NameThreadForDebuggingを](ダビデが指摘したようにD2010に実装)

あなたは匿名のスレッド(匿名関数を実行してのTThreadを必要としないスレッドを作成することができます

子孫オブジェクト):TThread.CreateAnonymousThread。

Delphiのスレッドフレームワークは、ここで説明されています

+0

名前を付けるスレッドが非常に便利な場合、単なるクロージャ(別の関数内のコードのブロック)なので、誰もそれに関連付けられた関数さえも持たない匿名スレッドオブジェクトを作成したいと思うということです。個人的に私はすべての私のバックグラウンドスレッドコードがTThreadから降りてくるクラスの内側から実行されることを望みます。 –

+1

@Warrenその欲望の理由はありますか? –

+1

ウォーレン、誰もあなたを止めていない:)しかし、匿名のバックグラウンドワーカーが十分な時間がある。 – gabr

7

gabrはおそらく主な新機能が追加に言及しました。おそらく、匿名メソッドを実行できるTThread.SynchronizeとTThread.Queueの新しいオーバーロードが残っています。私はあなたが話している「ネイティブ」の問題が途中TThreadに関連していないと思います

12

が実装されますが、RTLの他の側面にされています

  • メモリマネージャは非常に速く、よく書かれているが、複数のコアで多数の同時スレッドを実行しているときに線形にスケーリングできません。 (stringダイナミックアレイ等)
  • 参照カウントタイプは、また、それは、(マルチスレッドアプリケーションにひどくスケーリングすることができる原子参照カウント(x64の中InterlockedDecrement/InterlockedIncrement)を有することがASM lockオペコードを用いて実装されていますこのオペコードが実行されると、すべてのコアがフリーズします。たとえより新しいCPUがこれに対して進展したとしても、RCUの実装が拡張される可能性があります)。

これらの弱点は、すべてのマルチスレッドライブラリに共通しています。OTLでも約thisが発生します。 Delphiの非常に初期のバージョンから存在し、Delphi XE2にはまだ存在しています。 64ビットの実装は似ていますが(遅くても)、Mac OSプラットフォームはまったく同じ実装を共有しています。

デルファイでスケーリングマルチスレッドアプリケーションの作成方法については、this other SO questionを参照してください。

上記の両方の点は、特定の種類のアプリケーションでのみ表示されます。

これらの点を知っていて、スレッド内でメモリマネージャの呼び出しや文字列プロセスを乱用しない限り、Delphiではマルチスレッドについて心配する必要はありません。

13

また、既に言及されているものに加えて:

4

TThreadedQueueはXEで導入されました。

ワーカースレッドからメインスレッドまたは他のコンシューマスレッドに情報を渡すと便利です。残念ながら、複数のコンシューマスレッドを持つ最後の部分はバグでした。 Delphi 2009で導入されたTMonitorには、TThreadedQueueのキューへのアクセスを同期させるためのバグがありました。

これはXE2で修正されました。 tthreadedqueue-not-capable-of-multiple-consumers

関連する問題