Forms 有表格吗?

Forms 有表格吗?,forms,delphi,ipc,blocking,messages,Forms,Delphi,Ipc,Blocking,Messages,我想制作IPC,但我不能使用阻塞机制(SendMessage、PIPE、TCP),也不想使用线程(更多错误源)或存储数据(例如文件、注册表) 这里有2-4个软件在每台电脑,我想同步“消息存在” 这是什么?我解释一下。 每个应用都使用相同的数据库。它们通过两个查询周期性地读取“消息”,并查看“正常”和“报警”消息何时到达,或者它们何时全部打开并读取。 但其中一个是“选择的”,用互斥保护,它控制一个trayicon和气球提示。当信息到达时,它反映在托盘上。 当此应用程序死亡时,另一个应用程序将尝试获

我想制作IPC,但我不能使用阻塞机制(SendMessage、PIPE、TCP),也不想使用线程(更多错误源)或存储数据(例如文件、注册表)

这里有2-4个软件在每台电脑,我想同步“消息存在”

这是什么?我解释一下。 每个应用都使用相同的数据库。它们通过两个查询周期性地读取“消息”,并查看“正常”和“报警”消息何时到达,或者它们何时全部打开并读取。 但其中一个是“选择的”,用互斥保护,它控制一个trayicon和气球提示。当信息到达时,它反映在托盘上。 当此应用程序死亡时,另一个应用程序将尝试获取互斥,并控制托盘

如果状态发生变化(新消息到达,或所有消息已读取),我想使用IPC来表示“主控”,以便主控知道这一点,我们避免这种情况: Master显示托盘和气球,用户在另一个应用程序中阅读消息。在这种情况下,主机不知道它,并继续显示“新消息”控件。或者大师读了所有的,但是一条新的信息到达了。在这段时间里,船长必须告知这一点。 因为检查周期为:正常消息-5分钟,警报-2分钟

那么:为什么我不使用阻止IPC,比如SendMessage? 因为如果主机启动一个大查询(5分钟),那么另一个应用程序将在这段时间内被阻止..:-(

以前我尝试过临时文件,注册表写入,但它们都有“清理”的问题,所以数据仍然存在

然后我有了一个想法,每个表单对于“EnumWindows”都是可见的。如果消息存储在Title中,我只使用此表单的句柄进行PostMessage,并且主控可以读取标题,处理消息。 如果15分钟过去了,我们将忽略此消息,“消息”窗口将被破坏

好吧,好吧,这并不优雅,但我不知道有什么方法不在文件中存储任何内容,并且在没有线程地狱的情况下无法阻止(异步)

proc Send(Info : string):
  handles = EnumAndFindHandles();
  for handle in handles:
    o = CreateMessageForm(handle, Info);
    PostMessage(WM_MYMSG, handle, 11111, integer(o.Handle));

proc Recv(var Msg):
  if IsHandleValid(Msg.lParam) and ClassNameIsGood(Msg.lParam):
    txt = ReadWindowText(Msg.lParam);
    if txt > '':
       ...
我想知道两件事: 1.)您知道这种通信可能失败的情况吗?(标题丢失、更改或其他可能会以这种方式阻塞的内容)? 2.)如我所见,只有窗体才能在Windows中显示?你知道用另一个控件做这件事的方法吗

谢谢你的任何想法,好信息,建议

dd

考虑改用a

以下是一些好处:

  • 它不需要任何服务器端推送更新
  • 您不需要等待超时或通信问题:客户端根据需要刷新自己(例如,使用计时器)
  • 它在客户机-服务器方法中扩展得非常好(在两侧)
  • 线程体系结构模型更简洁:客户端可以使用主GUI线程,每个服务器连接可以采用无状态方法拥有自己的线程
  • 整个web(通过无状态HTTP协议)都在使用它,因此您可以使用HTTP进行通信,这比其他协议更便于网络

即使你还需要本地IPC,考虑搬到一个网络友好的体系结构可能会让你的未来更容易。如果需要,它还可以准备您的应用程序。例如,我们可以通过GDI消息(如您所建议的)或命名管道进行本地通信,或者使用HTTP/1.1进行远程通信。

对我来说,这似乎是一个简单的解决方案:在应用程序之间共享一块内存,就像使用临时文件一样。你说你考虑过基于文件的方法,但不喜欢它们留下的痕迹。对于内存映射文件,跟踪将位于页面文件中,这可能不像注册表或临时文件那样重要。

听起来不是一种正确的设计方法。检查我们的MsgConnect产品,它只做您需要的事情——使用SendMessageCallback或SendMEssageTimeoutCallback方法并异步发送消息。可以在同一台计算机上或通过网络发送消息。当与内存映射文件共享数据时,还应考虑在内容更新期间使用信号量来锁定资源(如果它不是只读内容)。对于同一个内存映射文件的并发访问,很容易陷入竞争状态或共享冲突,就像在多线程应用程序中一样。