控制台输出到不使用 SetOut 的文件
Console Output to a File not using SetOut
我正在从 C# 调用 Gurobi(多次)。因此,控制台输出是我的和 Gurobi 日志记录的混合体。如果我覆盖 Console.Out,只有我的输出被重定向,但 Gurobi(显然包装了一个非托管 dll)仍然写入屏幕。
有没有办法从控制台获取每一行(作为字符串或文件)?
您可以使用回调对象捕获 Gurobi 的控制台输出。回调对象有一个 Callback()
方法,调用该方法的原因有很多,其中之一是告诉您它即将写入控制台的文本。你可以用这个文本做任何你想做的事。在下面的示例中,我将文本写为调试输出:
class MyGRBCallback : GRBCallback
{
protected override void Callback()
{
if (this.where == GRB.Callback.MESSAGE)
{
String text = this.GetStringInfo(GRB.Callback.MSG_STRING);
Debug.WriteLine(text);
}
}
}
您使用 GRBModel 的 SetCallback
方法告诉 Gurobi 您的回调对象。
var env = new GRBEnv();
var m = new GRBModel(env);
var callback = new MyGRBCallback();
m.SetCallback(callback);
此时 Gurobi 将调用您的回调并写入控制台。你可以告诉 Gurobi 不要写到控制台:
env.Set(GRB.IntParam.LogToConsole, 0);
我正在从 C# 调用 Gurobi(多次)。因此,控制台输出是我的和 Gurobi 日志记录的混合体。如果我覆盖 Console.Out,只有我的输出被重定向,但 Gurobi(显然包装了一个非托管 dll)仍然写入屏幕。
有没有办法从控制台获取每一行(作为字符串或文件)?
您可以使用回调对象捕获 Gurobi 的控制台输出。回调对象有一个 Callback()
方法,调用该方法的原因有很多,其中之一是告诉您它即将写入控制台的文本。你可以用这个文本做任何你想做的事。在下面的示例中,我将文本写为调试输出:
class MyGRBCallback : GRBCallback
{
protected override void Callback()
{
if (this.where == GRB.Callback.MESSAGE)
{
String text = this.GetStringInfo(GRB.Callback.MSG_STRING);
Debug.WriteLine(text);
}
}
}
您使用 GRBModel 的 SetCallback
方法告诉 Gurobi 您的回调对象。
var env = new GRBEnv();
var m = new GRBModel(env);
var callback = new MyGRBCallback();
m.SetCallback(callback);
此时 Gurobi 将调用您的回调并写入控制台。你可以告诉 Gurobi 不要写到控制台:
env.Set(GRB.IntParam.LogToConsole, 0);