2

ミートスレッド:

    public void TimerFunc(){
        ...
        while (true)
        {
  ...
                sound.PlayLooping();
                // Displays the MessageBox and waits for user input
                MessageBox.Show(message, caption, buttons);
                // End the sound loop
                sound.Stop();
 ...

        }
    }

スレッドはメイン インターフェイスのボタンで開始され、インターフェイスのボタンで強制終了できます。

ユーザー入力を待っているときにスレッドが強制終了された場合、サウンドループを停止するにはどうすればよいですか?

4

1 に答える 1

2

スレッドを強制終了しないでください。スレッドが強制終了されると、何もできなくなります。

スレッドにメッセージを丁寧に送信して、再生を停止するように依頼してください。

private volatile bool canContinue = true;

public void TimerFunc(){
    ...
    while (true && canContinue)
    {
        ...
        sound.PlayLooping();
        // Displays the MessageBox and waits for user input
        MessageBox.Show(message, caption, buttons);
        // End the sound loop
        sound.Stop();
        ...
    }
}

public void StopPolitely()
{
    canContinue = false;
}

thread.StopPolitely()メインインターフェイスのボタンは、スレッドを呼び出して終了するだけです。より速く終了させたい場合は、canContinueより頻繁にチェックするかThread.Interrupt()、ブロック呼び出しでビジーであってもスレッドをウェイクアップするために使用するなど、他のより積極的なソリューションを検討できます (ただし、割り込みを管理する必要があります)。ブールであり、シングルライター/シングルリーダーであるため、宣言するvolatile必要がありますが、宣言を回避することもできます。

于 2013-08-14T01:39:53.317 に答える