Delphi - 调整线程休眠时间

Mar*_*mke 7 database delphi multithreading sleep

我的应用程序中有几个线程在后台运行.它们连接到数据库并执行一些耗时的选择查询.在大多数情况下,这些查询只返回几条记录.然而,有时他们可能会返回数万条记录.然后将所有这些循环处理.

因为这种情况可能同时发生在多个线程中,所以我不希望我的应用程序在这些线程处理数据时使用100%的CPU时间; 我也不想让所有线程争夺处理器的时间.因此,我在这些线程中的循环的每次迭代中调用Sleep()函数.

但是,我不知道如何调整睡眠时间.我不希望循环永远持续,所以睡眠时间不能太长.我在每次迭代中将它设置为2毫秒(在每个线程中)(为什么2ms? - 这是一个很好的问题:)).

另一方面,我认为我可以延长睡眠时间,但每n次迭代只调用一次睡眠(比方说,每50次迭代睡眠(100次)).我应该选择哪种方法?循环的一次迭代每次约30毫秒(没有任何睡眠).

请指教.

谢谢!
马里乌什.

mgh*_*hie 9

调用Sleep()毫无意义.使用您可以获得的所有处理能力,让系统了解如何最好地安排线程.调用Sleep()只会导致额外的上下文切换并降低吞吐量.如果后台处理干扰了您的主线程或其他应用程序,则相应地降低后台线程的优先级.

如果您想让线程休眠以限制它们为消费者生成的数据量,请查看生产者 - 消费者队列.让生产者线程在他们的队列满了时简单地阻塞,这样你根本不需要摆弄时间.

另请注意,使用最大CPU通常是一件好事,特别是在现代处理器上.即使在具有短时间高负载的笔记本电脑上也比人为地延长任务所需的时间更好,因为处理器/整个系统将能够更快地进入低功率状态.

  • 是的,但这就是为什么我写的后台线程优先级可以降低,保持其他应用程序(或主线程)响应,同时仍然使用完整的系统潜力.在现代(多核)系统上,保持所有核心充分负载比缺乏前台应用程序的响应性更成问题.无论如何,大规模的非优化I/O对系统的可用性的威胁要大于高CPU负载. (2认同)