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