我有一个程序从其他应用程序接收字符串消息并使用VCL解析它们。 消息发送如下:
AtomId := GlobalAddAtom(PChar(s));
SendMessage(MyProgramHandle, WM_MSG, 0, AtomID);
GlobalDeleteAtom(AtomID);
我的程序收到此消息,解析它一段时间,然后将控制权返回给应用程序。 解析一条消息需要时间,因此其他应用程序的性能会恶化。
一种可能的解决方案是在其他线程中创建具有相同标题和相同类的表单,并重命名主表单的类。 但据我所知,不建议在线程中创建表单。
那么,有哪些方法可以改善性能?
答案 0 :(得分:6)
典型的方法是创建工作线程(或工作线程池)。主线程将继续接收消息,但不是解析它们,而是将它们添加到队列(例如链接列表)。
工作线程获取队列中的第一个元素并对其进行处理。完成后,它会返回队列以获取下一个元素。
由于队列是多个线程之间的共享资源,因此您必须控制对它的访问。互斥锁将确保在任何给定时间只有一个线程可以访问队列。
祝你好运。答案 1 :(得分:2)
所以问题是消息的接收和VCL操作都是在相同的线程(主VCL线程)中完成的?因此,接收和处理是序列化的,因此当您的应用程序忙于填充网格时,发件人被阻止?然后我可以理解你要求一种方法将接收移动到另一个窗口消息循环。
所以我创建一个窗口(不是VCL表单)只是为了接收消息并使用它的消息循环来向队列添加消息。所以你只需要找到这个(非VCL)窗口和SendMessage到它的句柄。在VCL线程中,Timer可以获取下一个“n”消息并将它们添加到网格中。