Проблема с неуправляемым обратным вызовом в Windows Forms. Нарушение доступа - PullRequest
0 голосов
/ 13 июля 2011

У меня проблема с получением стороннего .dll, который использует неуправляемые обратные вызовы для работы в проекте ac # forms.Первоначально программа зависала после первого вызова обратного вызова.Однако ответ здесь помог мне решить эту проблему (Cdecl был правильным соглашением о вызовах).Определение обратного вызова в C # выглядит следующим образом:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void FrameDelegate(IntPtr lpContext, IntPtr bpData, int nDataSize, int nChannel, int isKeyFrame, int nFrameCnt);

Фактический обратный вызов выглядит следующим образом:

    public void FrameDelegate(IntPtr lpContext, IntPtr bpData, int nDataSize,
        int nChannel, int isKeyFrame, int nFrameCnt)
    {
        lock (ChannelStats)
        {
            ChannelStats.TotalSize += nDataSize;
            ChannelStats.CurrentFileSize += nDataSize;
            ChannelStats.FrameCount++;
        }
        UpdateStatistics();
    }

И функция статистики обновления:

    private void UpdateStatistics()
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new UpdateDelegate(UpdateStatistics));
        }
        else
        {
            lock (ChannelStats)
            {
                FrameCapturedLabel.Text = string.Format("Frames Captured: {0}", ChannelStats.FrameCount);
                TotalCapturedLabel.Text = string.Format("Total Captured: {0} [MB]", (double)ChannelStats.TotalSize / 1000000.0);
                CurrentFileLabel.Text = string.Format("Current File Size: {0} [MB]", (double)ChannelStats.CurrentFileSize / 1000000.0);
                FileCountLabel.Text = string.Format("File Count: {0}", ChannelStats.FileCount); 
            }                      
        }
    }

Код выполняетсяуспешно для случайного числа кадров (обычно 5-15), прежде чем он падает, за исключением нарушения прав доступа.К сожалению, это выполняется на удаленной встроенной системе, и поэтому у меня нет под рукой отладчика, который бы мне помог.Также обратите внимание:

  • Запуск вышеуказанного кода без вызова UpdateStatistics () работает нормально.
  • Запуск аналогичной программы в консольном приложении C32 Win32 работает нормально.

Итак, мой вопрос: есть ли намеки на то, что может быть причиной нарушения доступа?Является ли блокировка в коде разумной или она полностью отключена?

Любые входные данные приветствуются!

Edit

Определяется переменная ChannelStatsследующим образом:

    private class RecordStatistics
    {
        public Int64 TotalSize { get; set; }
        public Int64 CurrentFileSize { get; set; }
        public Int64 FileCount { get; set; }
        public Int64 FrameCount { get; set; }

        public RecordStatistics()
        {
            TotalSize = 0;
            CurrentFileSize = 0;
            FileCount = 0;
            FrameCount = 0;            
        }
    }

    RecordStatistics ChannelStats;

1 Ответ

1 голос
/ 13 июля 2011

Что такое ChannelStats?Это твой класс?Лучше, если вы делаете блокировку на отдельном объекте.

private static object _thisLock = new object();

lock (_thisLock)
{
    // Critical code section
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...