Как получить в режиме реального времени журнал через Perforce API похож на P4V Lo g
Я столкнулся с проблемой с перформанс API (.net), так как я не могу получить журналы синхронизации в режиме реального времени.
- Что я пытаюсь сделать
Я пытаюсь получить журналы в реальном времени, так как синхронизация запускается с помощью
Perforce.P4.Client.SyncFiles()
команда. Подобно журналам графического интерфейса P4V, которые обновляются, когда мы пытаемся синхронизировать любые файлы.
- Что происходит сейчас
Поскольку вывод генерируется только после того, как команда выполнена, ее выполнение не предназначено.
Также пытался заглянуть в
Perforce.P4.P4Server.RunCommand()
который предоставляет подробный отчет, но только после выполнения команды. Заглянул в это
Причина -
Я пытаюсь добавить обновление статуса в инструмент, над которым я работаю, который показывает, какой файл Perforce в данный момент синхронизируется.
Пожалуйста, порекомендуйте. Заранее спасибо.
-Bharath
1 ответ
В клиентском API C++ (на котором построен P4V) клиент получает OutputInfo
обратный звонок (или OutputStat
в tag
режим ged) для каждого файла при его синхронизации.
Просматривая документацию.NET, я думаю, что эквиваленты P4CallBacks.InfoResultsDelegate
а также P4CallBacks.TaggedOutputDelegate
которые обрабатывают такие события, как P4Server.InfoResultsReceived
и т.п.
У меня возникла та же проблема, и я изо всех сил пытался заставить ее работать, поэтому я поделюсь решением, которое я нашел:
Во-первых, вы должны использовать класс P4Server вместо Perforce.P4.Connection. Это два класса, которые делают более или менее одно и то же, но когда я попытался использовать события P4.Connection.TaggedOutputReceived, я просто ничего не получил обратно. Вместо этого я попробовал использовать P4Server.TaggedOutputReceived, и вот, наконец, я получил TaggedOutput, как и хотел.
Итак, вот небольшой пример:
P4Server p4Server = new P4Server(cwdPath); //In my case I use P4Config, so no need to set user or to login, but you can do all that with the p4Server here.
p4Server.TaggedOutputReceived += P4ServerTaggedOutputEvent;
p4Server.ErrorReceived += P4ServerErrorReceived;
bool syncSuccess=false;
try
{
P4Command syncCommand = new P4Command(p4Server, "sync", true, syncPath + "\\...");
P4CommandResult rslt = syncCommand.Run();
syncSuccess=true;
//Here you can read the content of the P4CommandResult
//But it will only be accessible when the command is finished.
}
catch (P4Exception ex) //Will be caught only when the command has failed
{
Console.WriteLine("P4Command failed: " + ex.Message);
}
И метод обработки сообщений об ошибках или taggedOutput:
private void P4ServerErrorReceived(uint cmdId, int severity, int errorNumber, string data)
{
Console.WriteLine("P4ServerErrorReceived:" + data);
}
private void P4ServerTaggedOutputEvent(uint cmdId, int ObjId, TaggedObject Obj)
{
Console.WriteLine("P4ServerTaggedOutputEvent:" + Obj["clientFile"]); //Write the synced file name.
//Note that I used this only for a 'Sync' command, for other commands, I guess there might not be any Obj["clientFile"], so you should check for that.
}