Переменная Control / Sync между несколькими потоками c # - PullRequest
0 голосов
/ 06 марта 2019

У меня возникли проблемы с синхронизацией следующего кода. По сути, у меня есть «recordingOn», когда «Истина», предполагается начать запись кадров в файл. В приведенной ниже программе, когда я иногда делаю Stop_Button_Click, я получаю исключение для «writer1.Write (frame1);» Это скорее всего потому, что это происходит после того, как я уже сделал dispose (). Как мне это синхронизировать? спасибо!

private bool recordingOn = false;

private void ConnectCameras_Button_Click(object sender, EventArgs e)
{
    if (!captureInProgress) //Start cameras streaming
    {
        camera1Capture.ImageGrabbed += ProcessFrame;
        camera1Capture.Start();
    }
    else //Stop cameras streaming
    {
        camera1Capture.Stop();
        imageBox1.Image = null;
        camera1Capture.ImageGrabbed -= ProcessFrame;
    }
    captureInProgress = !captureInProgress;
}

private void ProcessFrame(object sender, EventArgs arg)
{
    camera1Capture.Retrieve(frame1);
    imageBox1.Image = frame1;

    if (recordingOn)
    {
        try
        {
            writer1.Write(frame1);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

private void Stop_Button_Click(object sender, EventArgs e)
{
    // Doing other stuff...
    recordingOn = false;
    writer1.Dispose();      
}

1 Ответ

1 голос
/ 06 марта 2019

Основная проблема заключается в общей переменной в нескольких потоках. Пожалуйста, используйте lock для контроля доступа к общей переменной. Блокировка гарантирует, что одновременно только один поток может получить доступ к переменной.

private bool recordingOn = false;
private static object _lock = new Object();

private void ConnectCameras_Button_Click(object sender, EventArgs e)
{
    if (!captureInProgress) //Start cameras streaming
    {
        camera1Capture.ImageGrabbed += ProcessFrame;
        camera1Capture.Start();
    }
    else //Stop cameras streaming
    {
        camera1Capture.Stop();
        imageBox1.Image = null;
        camera1Capture.ImageGrabbed -= ProcessFrame;
    }
    captureInProgress = !captureInProgress;
}

private void ProcessFrame(object sender, EventArgs arg)
{
    camera1Capture.Retrieve(frame1);
    imageBox1.Image = frame1;
    lock (_lock)
    {
    if (recordingOn)
    {
        try
        {
            writer1.Write(frame1);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    }
}

private void Stop_Button_Click(object sender, EventArgs e)
{
    // Doing other stuff...
    lock (_lock)
    {
      recordingOn = false;
      writer1.Dispose();   
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...