Je suis l'utilisateur de Delphi 2010, ma machine actuelle est Intel Core i7, fonctionnant sous Windows 7 x64. J'ai écris les codes suivants:Delphi 2010: Pas de filetage vs discussions
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FCount: Integer;
FTickCount: Cardinal;
procedure DoTest;
procedure OnTerminate(Sender: TObject);
end;
TMyThread = class(TThread)
private
FMethod: TProc;
protected
procedure Execute; override;
public
constructor Create(const aCreateSuspended: Boolean; const aMethod: TProc);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
T1, T2: Cardinal;
begin
T1 := GetTickCount;
for i := 0 to 9 do
DoTest;
T2 := GetTickCount;
Memo1.Lines.Add(Format('no thread=%4f', [(T2 - T1)/1000]));
end;
procedure TForm1.Button2Click(Sender: TObject);
var T: TMyThread;
i: integer;
begin
FCount := 0;
FTickCount := GetTickCount;
for i := 0 to 9 do begin
T := TMyThread.Create(True, DoTest);
T.OnTerminate := OnTerminate;
T.Priority := tpTimeCritical;
if SetThreadAffinityMask(T.Handle, 1 shl (i mod 8)) = 0 then
raise Exception.Create(IntToStr(GetLastError));
Inc(FCount);
T.Start;
end;
end;
procedure TForm1.DoTest;
var i: integer;
begin
for i := 1 to 10000000 do
IntToStr(i);
end;
procedure TForm1.OnTerminate(Sender: TObject);
begin
Dec(FCount);
if FCount = 0 then
Memo1.Lines.Add(Format('thread=%4f', [(GetTickCount - FTickCount)/1000]));
end;
constructor TMyThread.Create(const aCreateSuspended: Boolean; const aMethod:
TProc);
begin
inherited Create(aCreateSuspended);
FMethod := aMethod;
FreeOnTerminate := True;
end;
procedure TMyThread.Execute;
begin
FMethod;
end;
Cliquez sur Button1 sera affiche 12,25 secondes, tandis que Bouton2 vous affichera 12.14 secondes. Mon problème est pourquoi je ne peux pas obtenir plus de différence évidente de temps pris (moins de 10 secondes) bien que je cours des fils parallèles?
s'il vous plaît rappelez-vous de formater votre question la prochaine fois – vodkhang
merci pour rappeler, mis à jour. – lmengyew
tpTimeCritical ne fait pas ce que vous pensez qu'il fait. La priorité de thread ne permet pas à vos threads de s'exécuter plus rapidement. cela les rend simplement préempter tous les autres threads en cours d'exécution qui ont une priorité inférieure. Par exemple, le thread principal de l'IDE peut être l'un de ces threads; vous pourriez potentiellement être incapable de percer dans le processus lors du débogage. La priorité de thread ne fait une différence pratique qu'en cas de conflit pour le processeur, c'est-à-dire un autre thread allant et restant à 100% sur un core. L'utilisation de la priorité de thread pour d'autres choses (comme la synchronisation) est un bug et ne devrait pas être fait. –