品尝 GNU Prolog (4)

来源:互联网 发布:sql server 按月分组 编辑:程序博客网 时间:2024/05/16 06:23

http://blog.csdn.net/lawme/archive/2008/10/18/3093692.aspx

 

七、一条大虫(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,结果正常。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lawme/archive/2008/10/18/3093692.aspx

原创粉丝点击