Как выполнить метод, специфичный для функции в другом классе от основного класса формы? (C #) - PullRequest
1 голос
/ 16 марта 2011

Может быть, мое отсутствие понимания какой-то ключевой концепции программирования в отношении полиморфизма или наследования интерфейса и т. Д., Это должно быть легко.Я новичок.

У меня есть отдельный класс в программе на C #, который называется tts.Теперь я определил функцию, которая называется говорить.вот оно:

class tts

{ 

     public void speak() 
     {

        Process process1 = new Process();
        process1.StartInfo.FileName = "C:\\Program Files\\eSpeak\\command_line\\espeak.exe";
        process1.StartInfo.Arguments = "hello";

        process1.StartInfo.UseShellExecute = false;
        process1.StartInfo.CreateNoWindow = true;

        process1.Start();
        //process1.Kill();
    }
}

Когда я вызываю эту функцию из главной формы для события (listBox1_SelectedIndexChange), она работает нормально.Эта программа читает «привет» каждый раз, когда я прокручиваю свой список.Но я хочу убить process1 при прокрутке до следующего элемента в списке.когда я реализую process1.Kill() (раскомментируя метод kill) в функции talk, программа не читает "привет".То, что происходит, - то, что process1 убивают немедленно.Так что я бы не реализовал там метод Kill () под функцией говори.Но я хочу убить process1 из основной формы, когда я изменяю индекс списка (listBox1_SelectedIndexChange).Вот мой основной код формы.

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        tts obj = new tts();
        obj.speak();
    }

То, что я хочу сделать, это:

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        tts obj = new tts();
        obj.speak();
        process1.Kill();
    }

, что, конечно, не будет работать, так как process1 находится в рамках функции говорить в классе tts,как выполнить process1.Kill() из основной формы?

Я бы оценил сам базовый код больше, чем технические термины о том, что делать.

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Одна вещь, которую вы можете сделать, это создать отдельный класс для управления процессом

Вот пример кода, как это выглядит:

class processmanagement
{
  Process p;

  public Process startprocess()
  {
    p = new Process();
  }

  public void killprocess(Process p1)
  {
    p = p1;
    if(p!=null)
      p.kill();
  }
}

или

class processmanagement
{
  Process p;

  public void startprocess()
  {
    p = new Process();
  }

  public void killprocess()
  {
    if(p!=null)
      p.kill();
  }
}
2 голосов
/ 16 марта 2011

Создайте process1 переменную экземпляра вашего tts класса и реализуйте там метод stopspeak, например:

class tts {
  Process process1;
  public void speak() { .... }
  public void stopspeak() {
    if (process1 != null)
      process1.Kill();
    process1 = null;
  }
}

Кроме того, вы также должны отслеживать текущий класс tts в своей основнойокно, так что вы можете написать

private tts obj;

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (obj != null) {
      obj.stopspeak();
      obj = null;
    }
    obj = new tts();
    obj.speak();
}
1 голос
/ 16 марта 2011

Ваш метод Speak может вернуть запущенный процесс:

public Process Speak()
{
    // Code as before
    return process1;
}

Тогда вы можете написать:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    TextToSpeech obj = new TextToSpeech();
    Process process = obj.Speak();
    process.Kill();
}

Если вы хотите фактически запустить процесс в одном событии и уничтожить его в другом, вам, вероятно, понадобится переменная экземпляра в вашей форме, которая поддерживает последний запущенный процесс:

private Process speechProcess;

private void StartButtonClicked(object sender, EventArgs e)
{
    // TODO: consider what you want to happen if there's already
    // a process running
    TextToSpeech obj = new TextToSpeech();
    speechProcess = obj.Speak();
}

private void StopButtonClicked(object sender, EventArgs e)
{
    // Possibly change the UI so that the button will be disabled
    // when there's no process running
    if (speechProcess == null)
    {
        return;
    }
    speechProcess.Kill();
    speechProcess = null;
}

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, это связывает класс TextToSpeech с идеей использования процесса. Будет лучше обеспечить инкапсуляцию, если вы возьмете на себя TextToSpeech ответственность за управление процессом, так что вы можете попросить его запустить и остановить соответствующим образом. Затем вы измените указанную выше переменную speechProcess с переменной типа Process на TextToSpeech.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...