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 如何使用多线程提高性能?_Multithreading_Delphi_Messages - Fatal编程技术网

Multithreading 如何使用多线程提高性能?

Multithreading 如何使用多线程提高性能?,multithreading,delphi,messages,Multithreading,Delphi,Messages,我有一个程序,它从其他应用程序接收字符串消息,并使用VCL解析它们。 信息发送方式如下: AtomId := GlobalAddAtom(PChar(s)); SendMessage(MyProgramHandle, WM_MSG, 0, AtomID); GlobalDeleteAtom(AtomID); 我的程序接收这个消息,解析它一段时间,然后将控制权返回给应用程序。 解析一条消息需要时间,所以其他应用程序的性能会恶化 一种可能的解决方案是在另一个线程中创建具有相同标题和相同类的表单,并

我有一个程序,它从其他应用程序接收字符串消息,并使用VCL解析它们。 信息发送方式如下:

AtomId := GlobalAddAtom(PChar(s));
SendMessage(MyProgramHandle, WM_MSG, 0, AtomID);
GlobalDeleteAtom(AtomID);
我的程序接收这个消息,解析它一段时间,然后将控制权返回给应用程序。 解析一条消息需要时间,所以其他应用程序的性能会恶化

一种可能的解决方案是在另一个线程中创建具有相同标题和相同类的表单,并重命名主表单的类。 但据我所知,不建议在线程中创建表单


那么,有哪些可能的方法可以提高性能呢?

典型的方法是创建一个工作线程(或工作线程池)。主线程将继续接收消息,但它不会解析消息,而是将消息添加到队列(例如,链表)

工作线程获取队列中的第一个元素并对其进行处理。完成后,它返回队列以获取下一个元素

由于队列是多个线程之间的共享资源,因此必须控制对它的访问。互斥锁将确保在任何给定时间只有一个线程访问队列


祝你好运。

那么问题是消息的接收和VCL操作都是在同一个线程中完成的(主VCL线程)?因此,接收和处理是序列化的,因此当你的应用程序忙于填充网格时,发送者被阻止?然后我可以理解,您需要一种方法将接收移动到不同的窗口消息循环


因此,我将创建一个窗口(不是VCL表单),仅用于接收消息,并使用其消息循环将消息添加到队列中。所以您只需要找到这个(非VCL)窗口并将消息发送到它的句柄。在VCL线程中,计时器可以获取下一个“n”消息并将其添加到网格中。

为什么要创建另一个表单?只需接收消息,然后在线程中进行处理。我必须使用VCL处理消息。我解析这个字符串并将结果放入网格中。消息被发送到具有指定标题和类的表单。如果我在主线程中处理消息,那么应用程序将等待返回控制。请确保线程是瓶颈。向网格中的单元格添加大量数据时,每次更新后都会调用重新绘制。Stringgrid.Cols[i]/Rows[i].Beginupdate-before和endupdate-after-update-before更新您的数据可以防止这种情况,并将大大提高性能。我使用的自定义组件基本上可以使用grid.beginupdate/endupdate。@Pieter即使绘图发生在零时间,主VCL线程仍然是使用此线程发布消息的客户端的主要瓶颈。如果有许多客户端,用户界面将变得无响应,客户端将相互阻止。谢谢您的回答。在处理过程中,我必须将结果放入网格中。因此,当主线程在网格中放置结果时,它不能接收消息。处理是什么意思?这是你在问题中没有描述的其他东西吗?您指示的所有处理都应移动到工作线程。主线程只负责GUI(如果您有GUI)以及在消息到达时向队列添加消息。你不想让主线程做繁重的工作,把主线程当作控制器,它只是把所有的事情都安排好让工作人员来做。处理意味着解析字符串并将结果放入网格中。我希望尽快恢复控制权。放入网格在主线程中运行,当我的程序放置smth时,它无法接收消息,因此无法立即返回控件。顺便说一句,对不起我的英语。正如我之前所说,工人线程做繁重的工作。如果您需要更新GUI,那么工作线程应该与主线程通信并请求GUI更新(这应该很快)。主线程不能长时间阻塞,请将除最基本的操作之外的所有操作移到工作线程,您会没事的。谢谢您的帮助。我试试。谢谢你的帮助。我试试看。