[英]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.