我在 SWI Prolog 和 Windows 7 上运行我的代码。在我的代码中,我使用 'win_exec()' 调用另一个应用程序(我尝试使用方法 'shell()',但它不起作用。),并且在end 在文本文件中生成其输出。但是有时它会运行 30 分钟。现在我的序言代码使用这个输出文本文件,进一步解析和处理它。这是我用来调用其他应用程序然后使用其输出文件的代码:
main(Value,X) :- win_exec('C:\\myfolder\\external_app.bat C:\\myfolder\\outputfile.txt', normal),
open('C:\\myfolder\\outputfile.txt', read, Mf),
read_file(Mf, X), % PROCEDURE TO READ FILE CONTENTS
close(Mf),
statistics(cputime, Value). % CALCULATE HOW LONG IT TOOK
但是,由于该文件尚未由另一个应用程序输出,因此会出现错误:
ERROR: open/4: source_sink `C:\myfolder\outputfile.txt' does not exist (No such file or directory)
因此,作为一种解决方法,我尝试捕获错误,通过与“existence_error”进行比较来处理它,然后递归调用 open 过程,直到它最终成功,即其他应用程序已完成其处理并生成输出文件。这是我的解决方法代码:
main(Value,X) :- win_exec('C:\\myfolder\\external_app.bat C:\\myfolder\\outputfile.txt', normal),
open_output(X), % PROCEDURE FOR FILE EXCEPTION HANDLING
statistics(cputime,Value).
open_output(X) :- catch((open('C:\\myfolder\\outputfile.txt', read, Mf), read_file(Mf,X), close(Mf)),
error(Err,Context),
open_output_aux(Err,X)). % AUX PROCEDURE TO RECOVER
% Write some code here
% open_output_aux code matches the error code with 'existence_error';
% if true, calls open_aux_wait procedure; else throw the error.
open_aux_wait(Z):- catch((open('C:\\myfolder\\outputfile.txt', read, Mf), read_file(Mf,Z), close(Mf)),
error(Err,Context),
open_aux_wait(Z)).
然而,这样做似乎效率很低。我想知道是否有更好的方法来做到这一点,比如在 java 中,你可以在处理文件异常时简单地调用 wait() 。在文档中,有一个方法“wait_for_input\3”,但它说“wait_for_input()”不能用于 Windows 中的文件流。我尝试使用它,但它给出了错误。
非常感谢任何帮助或指导。