品尝 GNU Prolog (4)

 七、一条大虫(bug)

用 gprolog 的 consult 运行 tictactoe.pl,OK,一切正常。

用 gplc 编译成 tictactoe.exe 后运行,oh! 程序卡死了。GTK-Server 对于用户的鼠标操作,不起反应。

问题的原因,是两端的程序联通受阻,直接肇事者是它:

    exec('gtk-server stdin post=.', Pout, Pin, _, _)

这条DOS控制台指令,使双方以STDIN方式建立的连接,造成了运行卡死的故障。

有可能这是 GNU Prolog 的一个 bug。

这个问题可以解决。方法是放弃 STDIN方式的连接,改用 TCP 方式的连接。修改后的谓词如下:

start:-
init(Socket, In, Out),
gui(Pin, Pout),
callback(Pin, Pout).

init(Socket, In, Out):-
% Start server in TCP mode
exec('gtk-server tcp=localhost:40000', _, _, _, _),
% Wait for the server to initialize
sleep(1),
% Define socket
socket('AF_INET', Socket),
% Try to connect
socket_connect(Socket, 'AF_INET'(localhost, 40000), In, Out).

api(In, Out, Txt, Result):-
% Write string to socket
write(Out, Txt),
% Force flush on socket
flush_output(Out),
% Read info
read_token(In, Result).

替换 tictactoe.pl 相应的谓词后,编译运行 tictactoe.exe,结果正常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值