У меня немного странная проблема, которую мне трудно отладить. Иногда я не могу закрыть свою программу, и она зависает, когда я пытаюсь закрыть ее.
Сделал большую программу для распознавания видеоизображений. Сделал специальную кнопку для закрытия камеры. Эта кнопка работает с этим, вызывая функцию ниже, и это действительно работает.
private void exitcamera()
{
FinalVideo.SignalToStop();
FinalVideo.WaitForStop();
FinalVideo = null;
}
Обратите внимание, что исходное видео было начато так
private void buttonStartCamera_Click(object sender, EventArgs e)
{
FinalVideo = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString);
FinalVideo.DesiredFrameSize = new System.Drawing.Size(640, 480);
FinalVideo.DesiredFrameRate = 90;
FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);
FinalVideo.ProvideSnapshots = true; //snapshots
FinalVideo.Start();
}
Теперь моя проблема кажется (и это предположение, потому что я не могу отладить этот момент), что какой-то поток все еще активен, желая обновить основную форму данными. Однако, возможно, он не сможет этого сделать, поскольку он закрывается. Я думаю, что что-то подобное происходит, поэтому я написал в основной форме заявки
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
// Thread.Sleep(1000); // not sure about these delays might help syncing threads
ExitCamera();
Thread.Sleep(1000);
}
Однако с этим последним кодом у программы еще больше проблем с выходом.
Я хотел бы отправить подпотокам выход, но я не знаю их имен (если у них есть имя), я не знаю, как их перечислить или проинструктировать их, чтобы они остановились, они находятся в другой dll, а не в моей части кода. От некоторых dll у меня нет кода.
Итак, есть ли способы перечислить подпотоки, а затем закрыть их один за другим, если нажать крестик в правом верхнем углу для выхода из приложения?