2010-12-03 9 views

答えて

4

Delphi XEにはTThread.CreateAnonymousThreadがあり、バックグラウンドタスクを簡単に実行できます。

些細なデモ:2010年以来

TThread.CreateAnonymousThread(
    procedure begin 
    Sleep(10000); // replace with a real workload 
    end 
).Start; 
7

リリース自体は最小限です。 Delphi 2009では、匿名メソッドのサポートをTThread.Synchronizeに追加し、XEでスレッド通信キューをGenerics.Collectionsに追加しました。

しかし、コミュニティはいくつか興味深いものに貢献しています。たとえば、OmniThreadLibraryをチェックしてください。

0

現在、マルチスレッドで実行するコードがある場合でも、マルチコアCPUはありません。ロックとロック解除の問題はここにある理由は

  1. メモリマネージャです。過去
  2. 文字列は、インターフェイスがIMO最も強力とDelphi 7の後に導入少なくとも知られているマルチスレッド機能がTThread.Queue方法参照カウント

チアー

+0

「現在、マルチコアのCPU」 - スレッドを作成すると、すべてが1つのコアで実行されると言っていますか? – RobertFrank

+2

これらはすべてのコアで実行できますが、/ usedと呼ばれるロックコードがある場合、memバス上にアサートして、他のCPU /コアを呼び出し中に停止させることができます。たとえば、4つのコアCPUと4つのスレッドが各コアで動作しているとします。ロックが発生した場合は、他のすべてのcpus /コアを停止する必要があります。ここであなたの読書のためです:http://software.intel.com/en-us/articles/implementing-scalable-atomic-locks-for-multi-core-intel-em64t-and-3232-architectures/ – APZ28

+0

それはまさに何ですか?私たちはEnhanced RTLとSynScaleMMを避けたかったのです。 http://synopse.info/forum/viewtopic.php?id=57を参照してください。しかし、主なボトルネックは、LOCK asm命令ではなく、メモリマネージャです。それがSynScaleMMが便利になったときです。 –

4

参照カウント

  • ですされたよりも良好です。たとえば、代わりに

    Synchronize(
        procedure 
        begin 
        Form1.Memo1.Lines.Add(‘Begin Execution’); 
        end); 
    

    のあなたは

    Queue(
        procedure 
        begin 
        Form1.Memo1.Lines.Add(‘Begin Execution’); 
        end); 
    

    TThread.Queueメインスレッドが終了するまで同期とワーカースレッドを待たずに継続することができますTThread.Synchronizeする代わりに、(ワーカースレッドが待機を呼び出しているを使用することができます同期されたコードの実行) - PostMessageでカスタムメッセージ処理の代わりに使用できる本当に素晴らしい機能です。

  • +0

    FYI、Delphi 10.2 Tokyoには、 '' TThread.ForceQueue() '](http://docwiki.embarcadero.com/Libraries/en/System.Classes.TThread.ForceQueue)が追加されています。これは' TThread.Queue ()を除いて、メインUIスレッド*で呼び出されたとしても、後で実行するために常に指定されたコードをキューに入れる点が異なります。 'TThread.Queue()'は、メインUIスレッドで呼び出されたときに実行をキューに入れません。すぐに実行されます( 'TThread.Synchronize()'のように)。 –

    1

    か、これは(ないprocesxpのような例のSysinternalsのもので)デバッガでのみ表示されてもXEスレッドは、名前を付けることができ

    関連する問題