У меня есть класс, который обрабатывает некоторые действия в реальном времени в потоке, который он запускает. В этом приложении есть и другие игры, так как оно очень сложное. Когда начинается это действие rt, мне нужно открыть окно и закрыть его, когда оно будет завершено. Звучит просто.
Есть события, к которым я подключаюсь, когда это действие начинается и останавливается. В этих обработчиках событий я размещаю код:
private void Voice_SpeakStarted(object sender, TMSpeakStartedEventArgs e)
{
InfoWindow = new Form();
InfoWindow.Show();
}
/// <summary>
/// this is the event handler speaking stops
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Voice_SpeakCompleted(object sender, TMSpeakCompletedEventArgs e)
{
if (InfoWindow.InvokeRequired)
{
InfoWindow.Invoke(new Action(() =>
{
InfoWindow.Close();
}));
InfoWindow.Hide();
}
}
Иногда я получаю сообщение об ошибке, что поток завершен. (Произошла ошибка при вызове метода. Целевой поток больше не существует.)
Кажется, у меня всегда есть окно, чтобы показать. Я не могу заставить окно закрыться.
Я также вижу, что иногда сам обработчик не вызывается.
Мне нужна плохая помощь. Я могу опубликовать больше кода, если это будет полезно.
Отредактировано - добавлено больше кода
Так я начинаю занятия
public void start()
{
//It's already alive, nothing to do
if (alive) return;
//Make sure this is the only place where alive is set to true
alive = true;
Voice.SpeakCompleted += new Speech.TMSpeakCompletedDelegate(Voice_SpeakCompleted);
Voice.SpeakStarted += new Speech.TMSpeakStartedDelegate(Voice_SpeakStarted);
dispatch = new Thread(new ThreadStart(ProcessSayList));
dispatch.Start();
}
Конструктор класса
public AnimationControl(dynamic parent)
{
Parent = parent;
Voice = new Speech();
q = Queue.Synchronized(new Queue(1000));
start();
}