2016-04-22 3 views
0

Я запускаю процесс из единицы, и это займет некоторое время (это может занять до 30 минут), однако я хочу, чтобы единство выполнялось в течение максимум 5 минут и если не было выхода, вернитесь. Я также хочу показать что-то подобное во время этого ожидания в течение 5 минут WaitКак сделать что-то во время процесса в Unity3d

У кого-нибудь есть идея, как это сделать? Я попытался с помощью этой строки кода

myProcess.WaitForExit(1000 * 60 * 5); 

, но я ничего не могу сделать, пока он ждет, я предполагаю, что это меня или что-то блокирует, может кто-нибудь помочь?

EDITED:

public void onClickFindSol(){ 
    paused=true; 
    ReadRedFace(); 
    ReadGreenFace(); 
    ReadBlueFace(); 
    ReadYellowFace(); 
    ReadOrangeFace(); 
    ReadWhiteFace(); 
    if (File.Exists (path)) 
     File.Delete (path); 
    System.IO.File.WriteAllText(path,InputToAlgo);  
    myProcess = new Process(); 
    myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    myProcess.StartInfo.CreateNoWindow = true; 
    myProcess.StartInfo.UseShellExecute = false; 
    myProcess.StartInfo.RedirectStandardOutput = true; 
    myProcess.StartInfo.FileName = (System.Environment.CurrentDirectory)+Path.DirectorySeparatorChar+"rubik3Sticker.ida2"; 
    myProcess.EnableRaisingEvents = true; 
    myProcess.StartInfo.WorkingDirectory = (System.Environment.CurrentDirectory)+Path.DirectorySeparatorChar; 
    myProcess.StartInfo.Arguments = "corner.bin edge1.bin edge2.bin"; 
    myProcess.OutputDataReceived += new DataReceivedEventHandler((sender, e) => 
    { 
     if (!String.IsNullOrEmpty(e.Data)){ 
      timer = 0f; 
      StepsOfSolution++; 
      print(e.Data); 
      solution.output.Add(e.Data); 
     } 
    }); 
    myProcess.Start(); 
    myProcess.BeginOutputReadLine(); 
} 
void Update(){ 
    if (myProcess != null){ 
     if(timer>fiveMinutes){ 
      myProcess.Kill(); 
      myProcess.Close(); 
      badExit=true; 
      myProcess=null; 
      return; 
     } 
     timer += Time.deltaTime; 
     if (!myProcess.HasExited){ 
      RubikScene.PleaseWait.SetActive(true); 
     } 
     else{ 
      if(badExit){ 
       RubikScene.PleaseWait.SetActive(false); 
       RubikScene.TooLong.SetActive(true); 
       print("TimeOut!"); 
      }else{ 
       paused=false; 
       Application.LoadLevel("solution"); 
      } 
     } 
    } 
} 
+0

сделать проверку таймер на выходе каждые Х секунд, пока таймер не более 5 минут, если он затем остановить процесс, не нужно блокировать ничего –

+0

@ user2320445 WaitForExit блокирует все. – Programmer

ответ

2

Не используйте myProcess.WaitForExit(). Он будет блокироваться, пока он не вернется. Используйте myProcess.Start(), затем в своей функции обновления запустите анимацию внутри if !myProcess.HasExited. Ваш код неполный, поэтому я предоставил неполное решение, но это должно сработать.

void Start() 
{ 
timer = 0;//Reset Timer 
myProcess.Start(); 
} 

Проверьте процесс завершен в функции Update

float timer = 0f; 
float fiveMinutes = 300; //300 seconds = 5minutes 
bool badExit = false; 

void Update() 
{ 
if (myProcess != null) 
{ 
    //Check if Time has reached 
    if(timer>fiveMinutes){ 
     myProcess.Kill(); 
     myProcess.Close(); 
     badExit = true; 
     return; 
    } 
    timer += Time.deltaTime; 

    if (!myProcess.HasExited) 
    { 
    //Do Your Animation Stuff Here 
    }else{ 
     //Check if this was bad or good exit 
     if(badExit){ 
     //Bad 
     }else{ 
     //Good 
     } 
    } 
} 
} 

Тогда где-то в вашей функции обратного вызова, где вы получите/читать из процесса, если байты читать, > 0 то всегда сбрасывать таймер до . Так что таймер будет считать только 5 минут, когда он ничего не получил для 5 минут.

myProcess.OutputDataReceived += new DataReceivedEventHandler((sender, e) => 
{ 
// Prepend line numbers to each line of the output. 
if (!String.IsNullOrEmpty(e.Data)) 
{ 
    timer = 0f; //Reset Process Timer 
    lineCount++; 
    output.Append("\n[" + lineCount + "]: " + e.Data); 
} 
}); 

ИЛИ с обратного вызова функции

private static void SortOutputHandler(object sendingProcess, 
      DataReceivedEventArgs outLine) 
{ 
    // Collect the sort command output. 
    if (!String.IsNullOrEmpty(outLine.Data)) 
    { 
     timer = 0f; //Reset Process Timer 
     numOutputLines++; 

     // Add the text to the collected output. 
     sortOutput.Append(Environment.NewLine + 
     "[" + numOutputLines.ToString() + "] - " + outLine.Data); 
    } 
} 
+0

Было бы проще, если вы установите 'timer = Time.time', а затем используйте' timer DRKblade

+0

Я избегаю' Time.time'. Это время, когда игра началась. Чем больше пушка работает, тем больше это число поднимается, а педераст - номер. В какой-то момент вы получаете действительно большое количество, подобное этому 93848589323 + fiveMinutes, и никто не знает, когда он сбрасывается. Time.deltaTime возвращает крошечное число, которое не требует операции большого числа, и это также зависит от частоты кадров, что означает, что он будет работать одинаково на каждом устройстве. – Programmer

+0

чувак ты спасатель! Спасибо Спасибо спасибо ! – msLangdon95

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