Forms 有表格吗?
我想制作IPC,但我不能使用阻塞机制(SendMessage、PIPE、TCP),也不想使用线程(更多错误源)或存储数据(例如文件、注册表) 这里有2-4个软件在每台电脑,我想同步“消息存在” 这是什么?我解释一下。 每个应用都使用相同的数据库。它们通过两个查询周期性地读取“消息”,并查看“正常”和“报警”消息何时到达,或者它们何时全部打开并读取。 但其中一个是“选择的”,用互斥保护,它控制一个trayicon和气球提示。当信息到达时,它反映在托盘上。 当此应用程序死亡时,另一个应用程序将尝试获取互斥,并控制托盘 如果状态发生变化(新消息到达,或所有消息已读取),我想使用IPC来表示“主控”,以便主控知道这一点,我们避免这种情况: Master显示托盘和气球,用户在另一个应用程序中阅读消息。在这种情况下,主机不知道它,并继续显示“新消息”控件。或者大师读了所有的,但是一条新的信息到达了。在这段时间里,船长必须告知这一点。 因为检查周期为:正常消息-5分钟,警报-2分钟 那么:为什么我不使用阻止IPC,比如SendMessage? 因为如果主机启动一个大查询(5分钟),那么另一个应用程序将在这段时间内被阻止..:-( 以前我尝试过临时文件,注册表写入,但它们都有“清理”的问题,所以数据仍然存在 然后我有了一个想法,每个表单对于“EnumWindows”都是可见的。如果消息存储在Title中,我只使用此表单的句柄进行PostMessage,并且主控可以读取标题,处理消息。 如果15分钟过去了,我们将忽略此消息,“消息”窗口将被破坏 好吧,好吧,这并不优雅,但我不知道有什么方法不在文件中存储任何内容,并且在没有线程地狱的情况下无法阻止(异步)Forms 有表格吗?,forms,delphi,ipc,blocking,messages,Forms,Delphi,Ipc,Blocking,Messages,我想制作IPC,但我不能使用阻塞机制(SendMessage、PIPE、TCP),也不想使用线程(更多错误源)或存储数据(例如文件、注册表) 这里有2-4个软件在每台电脑,我想同步“消息存在” 这是什么?我解释一下。 每个应用都使用相同的数据库。它们通过两个查询周期性地读取“消息”,并查看“正常”和“报警”消息何时到达,或者它们何时全部打开并读取。 但其中一个是“选择的”,用互斥保护,它控制一个trayicon和气球提示。当信息到达时,它反映在托盘上。 当此应用程序死亡时,另一个应用程序将尝试获
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方法并异步发送消息。可以在同一台计算机上或通过网络发送消息。当与内存映射文件共享数据时,还应考虑在内容更新期间使用信号量来锁定资源(如果它不是只读内容)。对于同一个内存映射文件的并发访问,很容易陷入竞争状态或共享冲突,就像在多线程应用程序中一样。