2014-01-27 2 views
0

Я пытаюсь прочитать вывод CGMiner в программе C#, которую я пишу. Я успешно читаю/записываю стандартный поток ввода/вывода. Но по какой-то причине CGMiner не пишет стандартный вывод cmd-окна, и я не могу его прочитать на C#. Есть идеи?Как читать вывод CGMiner?

Это начать мой процесс:

public void start() { 
     proc = new Process(); 
     proc.StartInfo.FileName = "CMD.exe"; 
     proc.StartInfo.RedirectStandardInput = true; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.StartInfo.UseShellExecute = false; 
     proc.OutputDataReceived += (s, e) => updateConsoleOutput(e); 
     proc.Start(); 
     proc.BeginOutputReadLine(); 
    } 

Это функция я использую, чтобы написать в консоли:

public void RunCommand(string cmd = "") { 
     if (cmd.Length > 0) { 
      ConsoleInput = cmd; 
     } 
     StreamWriter myStreamWriter = proc.StandardInput; 
     myStreamWriter.WriteLine(ConsoleInput); 
     myStreamWriter.Flush(); 
     ConsoleInput = String.Empty; 
    } 

Эти функции я использую для чтения с консоли:

public delegate void consoleOutputCallback(string message); 
    private void updateConsoleOutput(DataReceivedEventArgs outLine) { 
     if (!String.IsNullOrEmpty(outLine.Data)) { 
      this.Dispatcher.Invoke(
       new consoleOutputCallback(updateConsoleText), 
       new object[] { outLine.Data } 
      ); 
     } 
    } 
    public void updateConsoleText(string message) { 
     this.OutputBlock.Text += message + "\n"; 
    } 

СОВЕТ: Не знаю, помогает ли это, но CGMiner перезапишет все окно консоли и курсор всегда остается в левом верхнем углу и не двигается. Вся команда перед запуском CGMiner перезаписывается.


Забыл добавить, что это консольная команда я использую:

cd C:\cgminer\ 
del *.bin 
cgminer.exe -o stratum+tcp://global.wemineltc.com:3335 -O yongke.1:x -g 2 
+0

Пожалуйста, не включайте информацию о языке, используемом в заголовке вопроса, если это не имеет смысла без него. Теги служат для этой цели. –

ответ

0

Вы должны установить --per-устройства-статистики флаг для того, чтобы статистика GPU должны быть записаны в поток

И не забудьте добавить это к коду в вопросе

proc.StartInfo.CreateNoWindow = true; 
proc.StartInfo.RedirectStandardError = true; 
proc.ErrorDataReceived += (s, e) => updateConsoleOutput(e); 
.... 
proc.Start(); 
proc.BeginErrorReadLine(); 

Большинство шахтеров используют стандартную поток ошибок вместо стандартный поток вывода (для записи как выходные данные и ошибки) по какой-то причине ..

+0

, похоже, не работает для меня –

+0

@Michael Rudner Evanchik Я обновил свой ответ - сейчас его проверьте – bairog

+0

@Michael Rudner Evanchik Я забыл 'proc.BeginErrorReadLine()' - Я снова обновил свой ответ – bairog

0

единственное, что сделал это работа для меня была

-T 

вот мой рабочий код

Task StartGPUMiner(object set) 
    { 
     MinerParams m = new MinerParams(); 
     m = (MinerParams)set; 
     var tcs = new TaskCompletionSource<object>(); 
     Process p = new Process(); 
     ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo(); 
     start.FileName = m.ApplicationPath + "\\cgminer\\cgminer.exe"; 
     start.Arguments = " -I " + m.GpuIntisity + " -T --scrypt -o " + m.sProtocol + m.ServerName + ":" + m.ServerPort + " -u " + m.UserName + "." + m.WorkerName + " -p " + m.ThePassword + " " + m.GpuParams; 
     start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     start.RedirectStandardOutput = true; 
     start.UseShellExecute = false; 
     start.CreateNoWindow = true; 

     var proc = Process.Start(start); 
     proc.OutputDataReceived += (s, e) => 
     { 
      try 
      { 
       this.Invoke((Action)delegate 
       { 
        txtLog.Text += (e.Data + Environment.NewLine); 
       }); 
      } 
      catch { } 
     }; 

     try 
     { 
      proc.Exited += (s, e) => tcs.SetResult(null); 
      proc.EnableRaisingEvents = true; 
      proc.BeginOutputReadLine(); 
     } 
     catch { } 
      return tcs.Task; 
} 
+1

Пожалуйста, уточните ответ. –

+0

Я пробовал ** - T ** или ** - текстовый флаг ** вместо ** - для каждого устройства **. Для меня он работает только для эталонного режима. Если вы подключаетесь через ** stratum + tcp ** - последние данные, которые я получаю, это «зондирование для активного пула». ** Win 7 Ult 64bit SP1 + .NET 4.0 + cgminer 3.7.2 ** – bairog

Смежные вопросы