簡體   English   中英

如何在與主窗體類不同的類中執行特定於函數的方法? (C#)

[英]how to execute a method specific to a function in a different class from the main form class? (c#)

可能是我對多態性或接口繼承等一些關鍵編程概念的認識不足。這應該很容易。 我是新手。

我在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 )下從主窗體調用此函數時,它運行良好。 每次我滾動列表框時,該程序的作用都顯示為“ hello”。 但是當我滾動到列表框中的下一個項目時,我想殺死process1。 當我在process1.Kill()實現process1.Kill() (通過取消注釋kill方法)時,程序不會讀取“ hello”。 發生的情況是process1立即被殺死。 因此,我不會在speak函數下實現方法Kill()。 但是,當我更改列表框的索引( listBox1_SelectedIndexChange )時,我想從主窗體中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()

我會更喜歡基本代碼本身,而不是技術術語。

您可以做的一件事是創建單獨的類來管理流程

這是示例代碼,如下所示:

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();
  }
}

process1設為tts類的實例變量,並在stopspeak實現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();
}

您的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 如果您讓TextToSpeech負責流程管理,它將提供更好的封裝,因此您可以要求它適當地啟動和停止。 然后,將上述的speechProcess變量從Process類型變量更改為TextToSpeech

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM