Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Delphi中线程的概念方法_Multithreading_Delphi_Iteration - Fatal编程技术网

Multithreading Delphi中线程的概念方法

Multithreading Delphi中线程的概念方法,multithreading,delphi,iteration,Multithreading,Delphi,Iteration,两年多前,他给了我关于Delphi中线程的宝贵提示。他的回答对我非常有用,我觉得多亏了他,我取得了很大的进步。这篇文章可以找到 今天,我面临一个关于线程的“概念问题”。这并不是关于代码,而是关于一个人应该为某个问题选择的方法。我知道我们不应该征求个人意见,我只是问,从技术角度来看,这些方法中的一种是否必须避免,或者它们是否都是可行的 我的应用程序在数据库中有一个唯一产品编号(名为SKU)的列表。查询带有这些SKU的API时,我会返回一个JSON文件,其中包含关于这些产品的详细信息。这个JSON文

两年多前,他给了我关于Delphi中线程的宝贵提示。他的回答对我非常有用,我觉得多亏了他,我取得了很大的进步。这篇文章可以找到

今天,我面临一个关于线程的“概念问题”。这并不是关于代码,而是关于一个人应该为某个问题选择的方法。我知道我们不应该征求个人意见,我只是问,从技术角度来看,这些方法中的一种是否必须避免,或者它们是否都是可行的

我的应用程序在数据库中有一个唯一产品编号(名为SKU)的列表。查询带有这些SKU的API时,我会返回一个JSON文件,其中包含关于这些产品的详细信息。这个JSON文件被处理,结果显示在屏幕上,并保存在数据库中。因此,在一个步骤中,涉及一个下载过程,并在工作线程中执行

我认为整个过程可能采用两种不同的方法:

  • 当用户单击开始按钮时,将触发一个查询,根据用户条件生成SKU列表。然后构建一个Tstringlist,对于列表中的每个元素,启动一个线程,下载JSON,将结果发送回主线程并终止
  • 这张照片可以如下所示:

  • 当用户单击开始按钮时,将触发一个查询,根据用户条件生成SKU列表。不是将SKU编号一个接一个地发送到工作线程,而是发送整个列表,工作线程迭代该列表,将显示和保存的结果发送回主线程(通过同步事件)。因此,在终止之前,我们只有一个工作线程处理整个列表
  • 这张照片可以如下所示:

    我对这两种不同的方法进行了编码,它们都有效。。。我经历过的每一个缺点

    我不是一个专业的开发人员,这是一种爱好,在我继续沿着一条或另一条道路进行“抛光”之前,我想知道,从技术角度来看,根据您的知识和经验,我所描述的方法之一是否应该避免,以及为什么

    谢谢你的时间


    马蒂亚斯

    < P>本例中考虑的另一件事情是生成JSON的API的等待时间。例如,如果往返服务器需要30毫秒,在服务器上创建JSON需要0.01毫秒,那么即使每个请求位于不同的线程中,查询每个请求的单个JSON记录也没有多大意义。在这种情况下,减少对服务器的请求,在每个请求上返回更多数据,并在不同线程之间划分结果是有意义的


    另一件事是线程并不是每个问题的解决方案。我会问,为什么需要将每个sku分解为一个线程。每个线程运行多长时间,每个线程执行多少处理?一般来说,创建大量线程,让每个线程只工作一毫秒是没有意义的。您希望线程尽可能长时间处于活动状态,为作业处理尽可能多的数据。您不希望计算机在创建/销毁线程时所用的时间与实际执行有用的工作时所用的时间一样多。

    这两种方法都可以。这实际上取决于服务器是否允许并行下载多个JSON文件。如果是这样,那么就没有理由不并行下载它们。如果没有,那么你必须连续下载。如果有很多SKU需要下载,我会进一步采用并行方法,限制可以同时运行的线程数量,以避免服务器被淹没。如果更多的提问者投入同样多的精力准备他们的问题,+1,那将非常好。@RemyLebeau:再次感谢你的建议。我一定会研究线程节流。正如Dave Novo在他的回答中所建议的,我将测量每个解决方案的持续时间,并比较结果。此外,他提到线程不是解决一切问题的方法,我将尝试另一种没有线程的方法。@MartynA:正如尼古拉斯·博伊洛(17世纪的法国作家)所说:“构思良好的东西很清楚,说出来很容易”——嗯,这听起来不像法语那么好,但信息很清楚:如果你理解你的问题并能清楚地解释,你就有更好的机会得到答案:)我同意。API应该能够返回SKU数组,而不仅仅是单个SKU。如果您需要检索100个SKU,只需发出一个查询,然后立即获取这100个项目。创建100个线程是一个糟糕的解决方案。创建一个发出100个查询的线程也不好。创建一个线程也会降低性能。如果可以,请将应用程序设计为重用现有线程,而不是总是在完成任务后终止它们。请看@dave novo(以及Olivier和AmigoJack):先生,您在这里有一个非常好的观点-我做了计算,在创建工作线程之后和终止工作线程之前,平均经过的时间是250毫秒。工作线程的创建和销毁平均额外增加了80ms。主线程中对API服务器的直接IDHTTP查询平均为150ms。这没什么大区别,但让我想一想你说的话:线程越少,每个线程的工作量就越大,或者。。。根本没有线程(至少对于进程的这一部分)。繁忙的周末即将到来,谢谢你的建议,我会朝这个方向看:)@mathou-线程的创建和销毁是<1ms,而不是80ms。看见IDE为计时增加了大量开销