可能是我对多态性或接口继承等一些关键编程概念的认识不足。这应该很容易。我是新手。

我在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()(通过取消注释kill方法)时,程序不会读取“ hello”。发生的情况是process1立即被杀死。因此,我不会在speak函数下实现方法Kill()。但是我想在更改列表框(listBox1_SelectedIndexChange)的索引时从主窗体中删除process1。这是我的主要表单代码。

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

我会更喜欢基本代码本身,而不是技术术语。

最佳答案

您的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

10-02 06:56