如何在与主窗体类不同的类中执行特定于函数的方法?(c#)
可能是我对多态性或接口继承等一些关键编程概念缺乏认识。这应该很容易。我是个新手 我在C#程序中有一个单独的类叫做tts。现在我在其中定义了一个函数,叫做speak。这是:如何在与主窗体类不同的类中执行特定于函数的方法?(c#),c#,class,function,forms,methods,C#,Class,Function,Forms,Methods,可能是我对多态性或接口继承等一些关键编程概念缺乏认识。这应该很容易。我是个新手 我在C#程序中有一个单独的类叫做tts。现在我在其中定义了一个函数,叫做speak。这是: class tts { public void speak() { Process process1 = new Process(); process1.StartInfo.FileName = "C:\\Program Files\\eSpeak\\command
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\u SelectedIndexChange
)下的主窗体调用此函数时,它运行良好。这个程序所做的是每次我滚动列表框时读“你好”。但当我滚动到列表框中的下一项时,我想终止process1。当我在speak函数中实现process1.Kill()
(通过取消Kill方法的注释)时,程序不会读取“hello”。发生的情况是进程1立即被终止。所以我不会在speak函数下实现Kill()方法。但当我更改listbox的索引(listBox1\u 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类的函数speak范围内。如何从主窗体执行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
,您的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
,您可以做的一件事是创建seprate类来管理流程
下面是它的示例代码:
class processmanagement
{
Process p;
public Process startprocess()
{
p = new Process();
}
public void killprocess(Process p1)
{
p = p1;
if(p!=null)
p.kill();
}
}
或
您可以做的一件事是创建seprate类来管理流程 下面是它的示例代码:
class processmanagement
{
Process p;
public Process startprocess()
{
p = new Process();
}
public void killprocess(Process p1)
{
p = p1;
if(p!=null)
p.kill();
}
}
或
将
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();
}
将
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();
}
你只比我快了一分钟:)。如果我错了,请纠正我,但我看不出
processmanagement
类有任何用处:这个类只做Process
类本身。@MartinStettner-这是他在项目中要管理的所有流程的示例,而不是针对单个问题,我粘贴了代码,让他明白自己的工作中缺少什么design@PranayRana:您不需要任何额外的类来进行流程管理,因为流程
类正是用于此目的的。无论您在哪里使用processmanagement
类,您都可以以完全相同的方式使用Process
类(即使代码更少,因为在您的情况下,您必须1)创建processmanagement
类,2)调用startprocess
而不是简单地创建Process
类)。你的类只是代码重复(这被认为是糟糕的设计…。你只比我早了一分钟:)。如果我错了,请纠正我,但是我看不到processmanagement
类的任何用途:这个类只做Process
类本身。@MartinStettner-这是他将在项目中管理的所有流程的示例,而不是针对单个问题,我粘贴了代码,让他明白自己的工作中缺少什么design@PranayRana:您不需要任何额外的类来进行流程管理,因为流程
类正是用于此目的的。无论您在哪里使用processmanagement
类,您都可以以完全相同的方式使用Process
类(即使代码更少,因为在您的情况下,您必须1)创建processmanagement
类,2)调用startprocess
而不是简单地创建Process
类)。您的类只是代码重复(这被认为是糟糕的设计…)。我认为流程实例应该是TextToSpeech
类的私有实现细节。可能有一些实现根本不使用任何外部流程。我建议将TextToSpeech实例本身作为表单的实例变量,并实现一个“StopSpeak”方法(参见下面的回答)。我认为流程实例应该是TextToSpeech
类的私有实现细节。可能有一些实现根本不使用任何外部流程。我建议把TextToSpeech变成instanc