在Delphi XE2的无限等待线程中调用哪种wait方法

Pet*_*ner 3 delphi multithreading delphi-xe2

如果我有一个

While not terminated do
begin
     doStuff;

end
Run Code Online (Sandbox Code Playgroud)

在Delphi XE2线程的execute方法中循环,我想不要让它变成我所有的翻牌.

我该怎么称呼

在Delphi 7中,它很简单,我称之为Sleep(X),其中X与我认为该线程的有趣程度成反比.

但是现在,我有了

SpinWait(X);
Run Code Online (Sandbox Code Playgroud)

其中调用YieldProcessor X的次数

Yield;
Run Code Online (Sandbox Code Playgroud)

它调用windows函数"SwitchToThread".

我应该使用其中任何一个还是应该设置线程的优先级?

Rob*_*edy 7

SpinWait浪费时间而不放弃处理器.它就像Sleep,但在延迟期间没有让任何其他线程控制.如果你没有多个核心,那么这是完全浪费,因为在你旋转时没有其他线程可以做任何事情.就我所知,Yield类似于Sleep(0),除非没有其他线程准备好运行,那么调用线程会立即继续.

如果你知道你的线程真的没有别的事可做,那么这些听起来都不是你想要的.

最好的解决方案是找到或建立一些可以等待发出信号的可等待对象(如信号量,事件或进程句柄).然后你根本不必费心醒来,这样你就可以轮询你的状态并再次入睡.