2010-12-03 12 views

Antwort

4

In Delphi XE gibt es eine TThread.CreateAnonymousThread, die eine einfache Ausführung von Hintergrundaufgaben ermöglicht.

Eine triviale Demo:

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

Minimal in den Versionen selbst. In Delphi 2009 wurde die Unterstützung für anonyme Methoden in TThread.Synchronize hinzugefügt, und in XE wurde eine Thread-Kommunikationswarteschlange zu Generics.Collections hinzugefügt.

Aber die Gemeinde hat einige interessante Sachen beigetragen. Zum Beispiel, überprüfen Sie OmniThreadLibrary.

0

Derzeit keine Multicores-CPU, auch wenn Codes in Multithreads ausgeführt werden. sperren und entsperren Problem ist, warum

  1. Speichermanager. es ist besser als in der Vergangenheit
  2. String Referenzzähler
  3. Schnittstelle Referenzzähler ist

Cheer

+0

"Derzeit liegen keine Multicores cpu" - Sagst du, dass, wenn ich Threads erzeuge, sie * alle * auf einem Kern laufen? – RobertFrank

+2

Sie können auf allen Kernen laufen, aber wenn es jemals einen Sperrcode namens/used gibt, kann er auf dem mem-Bus aktivieren, wodurch andere CPUs/Kerne für die Dauer des Aufrufs angehalten werden. Nehmen wir an, Sie haben eine CPU mit vier Kernen und vier Threads, die auf jedem Kern ausgeführt werden. Wenn die Sperre aufgetreten ist, müssen alle anderen CPUs/Kerne angehalten werden. Hier ist für Sie zu lesen: http://software.intel.com/en-us/articles/implementing-scalable-atomic-locks-for-multi-core-intel-em64t-and-ia32-architectures/ – APZ28

+0

Das ist genau was das wollten wir in unserer Enhanced RTL und mit unserem SynScaleMM vermeiden. Siehe http://synopse.info/forum/viewtopic.php?id=57 Der größte Engpass ist jedoch definitiv der Speichermanager, nicht diese LOCK asm-Anweisungen. Dann ist SynScaleMM praktisch. –

4

IMO die stärkste und die am wenigsten bekannte Multi-Threading-Funktion eingeführt, nachdem Delphi 7 TThread.Queue Methode. Zum Beispiel, statt

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

können Sie verwenden

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

TThread.Queue sind eine Alternative zu TThread.Synchronize, dass ein Arbeitsthread (mit Synchronize ruft eine Worker-Thread wartet, bis der Haupt-Thread beendet fortzusetzen, ohne zu warten erlaubt Ausführung des synchronisierten Codes) - ein wirklich nettes Feature, das als Ersatz für die benutzerdefinierte Nachrichtenverarbeitung mit PostMessage verwendet werden kann.

+0

FYI, Delphi 10.2 Tokyo hat ['TThread.ForceQueue()'.] (Http://docwiki.embarcadero.com/Libraries/en/System.Classes.TThread.ForceQueue) hinzugefügt, was ähnlich wie TThread.Queue ist() 'mit der Ausnahme, dass der angegebene Code immer zur späteren Ausführung in die Warteschlange gestellt wird *, selbst wenn er im Haupt-UI-Thread * aufgerufen wird. 'TThread.Queue()' führt die Ausführung der Warteschlange nicht aus, wenn sie im Haupt-UI-Thread aufgerufen wird. Sie wird sofort ausgeführt, wie 'TThread.Synchronize()'. –

1

Seit 2010 oder XE Themen benannt werden kann, obwohl dies nur sichtbar im Debugger ist (nicht in zB sysinternals Sachen wie procesxp)

Verwandte Themen