- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试设置一个 Ruby 脚本,该脚本在循环中从命名管道读取数据,阻塞直到管道中的输入可用。
我有一个定期将调试事件放入命名管道的进程:
# Open the logging pipe
log = File.open("log_pipe", "w+") #'log_pipe' created in shell using mkfifo
...
# An interesting event happens
log.puts "Interesting event #4291 occurred"
log.flush
...
然后我想要一个单独的进程,它将从此管道中读取并在事件发生时将事件打印到控制台。我试过使用这样的代码:
input = File.open("log_pipe", "r+")
while true
puts input.gets #I expect this to block and wait for input
end
# Kill loop with ctrl+c when done
我希望 input.gets
阻塞,耐心等待直到新输入到达 fifo;但它立即读取 nil
并再次循环,滚动到控制台窗口的顶部。
我试过的两件事:
我已经用“r”和“r+”打开了输入 fifo——无论哪种方式我都遇到了同样的问题;
我已尝试确定我的写入过程是否正在发送 EOF(我听说这会导致读取 fifo 关闭)-- 据我所知,事实并非如此。
一些背景:
如果有帮助,这是我正在尝试做的事情的“大局” View :
我正在开发一款在 RGSS 中运行的游戏,RGSS 是一种基于 Ruby 的游戏引擎。由于它没有很好的集成调试,我想在游戏运行时设置一个实时日志——当游戏中发生事件时,我希望消息显示在侧面的控制台窗口中。我可以使用类似于上面编写器代码的代码将 Ruby 游戏代码中的事件发送到命名管道;我现在正在尝试设置一个单独的进程,该进程将等待事件出现在管道中并在它们到达时显示在控制台上。我什至不确定我是否需要 Ruby 来执行此操作,但这是我能想到的第一个解决方案。
请注意,我正在使用来自 cygwin 的 mkfifo
,我碰巧安装了它;我想知道这是否是我麻烦的根源。
如果它对任何人有帮助,这正是我在 irb 中看到的“读者”流程:
irb(main):001:0> input = File.open("mypipe", "r")
=> #<File:mypipe>
irb(main):002:0> x = input.gets
=> nil
irb(main):003:0> x = input.gets
=> nil
我不希望 002 和 003 处的 input.gets
立即返回——我希望它们会阻塞。
最佳答案
我找到了一个解决方案,可以完全避免使用 Cygwin 不可靠的命名管道实现。 Windows 有自己的命名管道工具,甚至还有一个名为 win32-pipe 的 Ruby Gem。使用它。
不幸的是,似乎无法在 RGSS 脚本中使用 Ruby Gems;但是通过剖析 win32-pipe gem,我能够将相同的想法整合到 RGSS 游戏中。此代码是将游戏事件实时记录到后台 channel 所需的最低限度,但它对于深度调试非常有用。
我在'Main'之前添加了一个新的脚本页面并添加了这个:
module PipeLogger
# -- Change THIS to change the name of the pipe!
PIPE_NAME = "RGSSPipe"
# Constant Defines
PIPE_DEFAULT_MODE = 0 # Pipe operation mode
PIPE_ACCESS_DUPLEX = 0x00000003 # Pipe open mode
PIPE_UNLIMITED_INSTANCES = 255 # Number of concurrent instances
PIPE_BUFFER_SIZE = 1024 # Size of I/O buffer (1K)
PIPE_TIMEOUT = 5000 # Wait time for buffer (5 secs)
INVALID_HANDLE_VALUE = 0xFFFFFFFF # Retval for bad pipe handle
#-----------------------------------------------------------------------
# make_APIs
#-----------------------------------------------------------------------
def self.make_APIs
$CreateNamedPipe = Win32API.new('kernel32', 'CreateNamedPipe', 'PLLLLLLL', 'L')
$FlushFileBuffers = Win32API.new('kernel32', 'FlushFileBuffers', 'L', 'B')
$DisconnectNamedPipe = Win32API.new('kernel32', 'DisconnectNamedPipe', 'L', 'B')
$WriteFile = Win32API.new('kernel32', 'WriteFile', 'LPLPP', 'B')
$CloseHandle = Win32API.new('kernel32', 'CloseHandle', 'L', 'B')
end
#-----------------------------------------------------------------------
# setup_pipe
#-----------------------------------------------------------------------
def self.setup_pipe
make_APIs
@@name = "\\\\.\\pipe\\" + PIPE_NAME
@@pipe_mode = PIPE_DEFAULT_MODE
@@open_mode = PIPE_ACCESS_DUPLEX
@@pipe = nil
@@buffer = 0.chr * PIPE_BUFFER_SIZE
@@size = 0
@@bytes = [0].pack('L')
@@pipe = $CreateNamedPipe.call(
@@name,
@@open_mode,
@@pipe_mode,
PIPE_UNLIMITED_INSTANCES,
PIPE_BUFFER_SIZE,
PIPE_BUFFER_SIZE,
PIPE_TIMEOUT,
0
)
if @@pipe == INVALID_HANDLE_VALUE
# If we could not open the pipe, notify the user
# and proceed quietly
print "WARNING -- Unable to create named pipe: " + PIPE_NAME
@@pipe = nil
else
# Prompt the user to open the pipe
print "Please launch the RGSSMonitor.rb script"
end
end
#-----------------------------------------------------------------------
# write_to_pipe ('msg' must be a string)
#-----------------------------------------------------------------------
def self.write_to_pipe(msg)
if @@pipe
# Format data
@@buffer = msg
@@size = msg.size
$WriteFile.call(@@pipe, @@buffer, @@buffer.size, @@bytes, 0)
end
end
#------------------------------------------------------------------------
# close_pipe
#------------------------------------------------------------------------
def self.close_pipe
if @@pipe
# Send kill message to RGSSMonitor
@@buffer = "!!GAMEOVER!!"
@@size = @@buffer.size
$WriteFile.call(@@pipe, @@buffer, @@buffer.size, @@bytes, 0)
# Close down the pipe
$FlushFileBuffers.call(@@pipe)
$DisconnectNamedPipe.call(@@pipe)
$CloseHandle.call(@@pipe)
@@pipe = nil
end
end
end
要使用它,您只需要确保在编写事件之前调用PipeLogger::setup_pipe
;并在游戏退出前调用 PipeLogger::close_pipe
。 (我将设置调用放在“Main”的开头,并添加一个 ensure
子句来调用 close_pipe
。)之后,您可以添加对 的调用PipeLogger::write_to_pipe("msg")
在任何脚本中的任何位置使用“msg”的任何字符串写入管道。
我已经用 RPG Maker XP 测试了这段代码;它也应该适用于 RPG Maker VX 及更高版本。
您还需要从管道中读取一些内容。有许多方法可以做到这一点,但一个简单的方法是使用标准的 Ruby 安装、win32-pipe Ruby Gem 和这个脚本:
require 'rubygems'
require 'win32/pipe'
include Win32
# -- Change THIS to change the name of the pipe!
PIPE_NAME = "RGSSPipe"
Thread.new { loop { sleep 0.01 } } # Allow Ctrl+C
pipe = Pipe::Client.new(PIPE_NAME)
continue = true
while continue
msg = pipe.read.to_s
puts msg
continue = false if msg.chomp == "!!GAMEOVER!!"
end
我使用 Ruby 1.8.7 for Windows和 win32-pipe gem上面提到的(请参阅 here 以获得有关安装 gems 的良好引用)。将以上内容保存为“RGSSMonitor.rb”并从命令行调用它作为 ruby RGSSMonitor.rb
。
注意事项:
RGSSMonitor.rb
),你会遇到问题。 Windows 命名管 Prop 有固定大小(我在这里将其设置为 1K),默认情况下,写入将在管道被填满后阻塞(因为没有进程通过从中读取来“缓解压力”)。不幸的是,RPGXP 引擎会终止已停止运行 10 秒的 Ruby 脚本。 (我听说 RPGVX 取消了这个看门狗功能——在这种情况下,游戏将挂起而不是突然终止。)关于ruby - 如何阻止读取 Ruby 中的命名管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796258/
我刚开始学习JSP技术,遇到了瓶颈。 如何从 JSP 声明 block ? 这不起作用: ... 服务器说没有“out”。 U: 我确实知道如何使用返回字符串的方法重写代码,但是有没有办法在 ?
在一个字段中,我想设置一个具有自定义过滤器的自定义分析器-着眼于词干-因此,“闪存卡”和“闪存卡”的词根相同,因此返回的结果相同 当我运行以下查询时,我的命中率很高,但是“闪存卡”和“闪存卡”各自返回
快速提问。 我有一个通过 PInvoke 使用 native DLL 的应用程序,这个 DLL 可能会调用 PostQuitMessage()。 如何避免? (因为我的应用程序不应该关闭) 我试过 A
一些给定的 HTML 文章,例如: Content 与一些基本的 Jquery 结合使用,例如: $(".some_
我正在构建一个灯箱相册。当第一个图像加载时,CSS 转换起作用。当加载后的每个图像都没有。任何想法为什么?加载第一张之后的照片,但没有过渡。 Image.prototype.load = functi
这个问题在这里已经有了答案: Disable recent tasks button on Android 5.0 (2 个答案) 关闭 2 年前。 我知道这个问题之前在这里被问过 Android
我是 Objective-C 的新手,我只是想弄清楚我是否可以使用 block 或选择器作为 UIAlertView 的 UIAlertViewDelegate 参数 - 哪个更合适? 我已经尝试了以
我是 Linux (UNIX) 套接字下套接字编程的新手。我在 Internet 上找到了以下代码,用于为每个连接生成一个线程的 tcp 服务器。但是它不起作用。accept() 函数立即返回,不等待
recv()库函数手册页提到: It returns the number of bytes received. It normally returns any data available, up
我有一个用于其他项目的共享 ts 库。在这个库中有被同一个库的其他资源使用的资源。该库的结构分为 components/*、interfaces/*、services/* 等目录。在每个目录的根目录中
我想在同一行中一个接一个地显示我的 ListView ,但 ListView 显示每个新行中的每个项目。我怎样才能防止换行显示。以便它显示为段落 ListView.builder( shr
我有一个包含数千行的表格。 import React from "react" import { useSelector } from "react-redux"; import { useEffec
假设我通常希望收到关于代码中不完整模式的警告,但有时我知道某个函数的模式不完整,我知道这很好。 是still true GHC 的警告粒度是每个模块的,并且没有办法更改有关特定功能或定义的警告? 最佳
我的网络应用程序发送浏览器通知,我知道如何检查通知的浏览器权限,以及如果未授予权限,如何请求权限。 但是,即使用户授予我的站点发送通知的权限,她可能仍然无法收到通知,因为它们 might be dis
我有 Xcode 3.2.1,并且喜欢使用它,但是当我编辑文本中带有超链接的文件时(例如,带有引用的注释:# see http://example.com)Xcode 将文本变成可点击的超链接。尝试编
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我有一个在 MY_Controller 中运行的 acl。如果权限被拒绝,那么此刻,我只是执行 redirect('denied') - 这是一个非常基本的 Controller ,它加载一个非常基本
我一直很好奇尝试从 Chrome 切换到 Firefox Quantum,但是对于 Web 开发遇到了一个我无法轻松解决的主要障碍——它正在缓存我的本地主机文件,因此当我尝试在本地主机加载各种 emb
这真的让我很兴奋!在任何时候,我都会参与多个项目。当我退出Xcode时,下次打开Xcode时,我前一天的所有项目都会自动一一打开。 经常我最终编辑错误的文件,AHHHHHHHHHHH!我可以阻止这种行
我的Wiki上有500个左右的Spambot和大约5个实际注册用户。我已经使用nuke删除了他们的页面,但是他们一直在重新发布。我已经使用reCaptcha控制了spambot的注册。现在,我只需要一
我是一名优秀的程序员,十分优秀!