Multithreading delphi是一个很好的高i/o使用率模式

Multithreading delphi是一个很好的高i/o使用率模式,multithreading,delphi,thread-safety,Multithreading,Delphi,Thread Safety,我有一个程序,使用5个串行端口从硬件获取数据,并将其保存在MySQL数据库中,还使用tcp/ip将其传输到第三方 对于串行端口,我使用Async,因此线程是分开的。因此,它们无法使系统ui滞后。但是,如果在由串行端口组件创建的线程中使用MySQL连接,则会浪费时间读取缓冲区,并导致缓冲区过载错误 另一方面,如果我将数据进程和MySQL存储发送到匿名线程,则会导致队列中出现许多工作线程 处理此类应用程序的最佳方法是什么?您描述的问题可以通过在COM端口和MySQL线程之间设置FIFO队列来解决。C

我有一个程序,使用5个串行端口从硬件获取数据,并将其保存在MySQL数据库中,还使用tcp/ip将其传输到第三方

对于串行端口,我使用Async,因此线程是分开的。因此,它们无法使系统ui滞后。但是,如果在由串行端口组件创建的线程中使用MySQL连接,则会浪费时间读取缓冲区,并导致缓冲区过载错误

另一方面,如果我将数据进程和MySQL存储发送到匿名线程,则会导致队列中出现许多工作线程


处理此类应用程序的最佳方法是什么?

您描述的问题可以通过在COM端口和MySQL线程之间设置FIFO队列来解决。COM设备有一些数据流(将其命名为上游),将这些数据放入线程安全的FIFO(Delphi有一个实现:System.Generics.Collections.TThreadedQueue),并为MySQL分配N个线程,这些线程将从FIFO队列中读取数据部分(将其命名为下游)。所以你们把你们的问题转化为经典的生产者/消费者任务。如果MySQL线程太慢,FIFO大小会增加,在这种情况下,您必须增加MySQL线程的数量。您可以通过查看FIFO平均大小来检测最佳MySQL线程数

当物理设备写入数据的速度快于程序处理数据的速度时,会导致驱动程序缓冲区过载问题。在您的例子中,这种情况的发生是由于MySQL线程部分的缓慢


说实话,与CPU和线程相比,COM端口速度非常慢,我相信问题的核心是——您从COM设备读取大量小数据块,并将每个小数据块包装到MySQL库后台的SQL操作中。将您的目光转向批处理—将大量低大小数据组合到更大的数据批中,因此,您可以减少TCP/IP上的SQL操作量

现在似乎很难向这么多人解释一些事情。我的问题完全清楚。由于工作线程太多,我的负载很高。信息太少,更难找到答案,和/或正在尝试的示例此问题完全不清楚。好的,您的意思是数据库连接传输数据的速度比串行端口传输数据的速度慢得多。您的解决方案是构建一个堆栈并处理缓慢的数据库写入。@nolaspeaker是的,由于5个串行端口同时发送数据并对其进行处理,我在处理缓冲区数据方面存在延迟……您可以在我的Delphi框架的Aio.pas中发现COM设备实现。该框架可以帮助消除i/O操作的多线程。它使用操作系统的重叠异步API模型感谢您的完整解释,