Получение ошибки C2248 при попытке инициализировать MFC CCriticalSection

Я пытался исправить/найти решение в течение часа или около того для этого. В основном у меня есть:

CCriticalSection pCS;

внутри объявления класса, а затем я использую CSingleLock следующим образом:

CSingleLock pSL(&pCS);
pSL.Lock();
*Stuff happening here*
pSL.Unlock();

для блокировки и разблокировки PCS. Но инициализация CriticalSection всегда заканчивается следующим образом:

c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxmt.h(82): error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(535) : see declaration of 'CObject::operator ='
c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(509) : see declaration of 'CObject'
This diagnostic occurred in the compiler generated function 'CSyncObject &CSyncObject::operator =(const CSyncObject &)'

У меня в программе 4 рабочих потока, и я отправляю им указатель на класс, в котором находится CCriticalSection, и потоки работают на CCriticalSection, а также в основном потоке. Потоки используют указатель класса для использования CSingleLock, который использует CCriticalSection.

К вашему сведению, код также включает Direct2D, но это не имеет значения.

Некоторая помощь будет оценена по достоинству.

РЕДАКТИРОВАТЬ:

Просто попытался сделать новый проект только с:

#include <afxmt.h>

в этом. Это дало мне исключения. Это нормально? Я использую VС++ 2010 Professional.

РЕШЕНО:

Там тоже был CEvent, поэтому я подумал, что тоже сделаю его указателем, и что вы знаете. Это устранило эту проблему. Теперь есть файл afxmt.h, дающий мне исключения.


person Nooobody    schedule 05.10.2012    source источник
comment
Ошибка указывает на то, что вы пытаетесь сделать копию CCriticalSection, но этот тип не может быть скопирован. Вам нужно показать больше кода, а именно код, пытающийся выполнить указанную копию.   -  person ildjarn    schedule 06.10.2012
comment
Есть ли шанс, что объект, содержащий этот критический раздел (pCS в вашем коде), каким-либо образом скопирован? Кажется, что ссылаются на конструктор копирования для CCriticalSection. Если вы явно не копируете крит-сек, вы когда-нибудь явно или неявно копируете объект, который его содержит? скройте конструктор-копию вашего класса (сделайте его закрытым), и если он где-то сломает компиляцию, вы ошибетесь).   -  person WhozCraig    schedule 06.10.2012
comment
Я только объявляю переменную, а затем использую CSingleLocks для использования CCriticalSection. В коде нет места для копирования CriticalSection. Я изменил CCriticalSection pCS на CCriticalSection* pCS, но он по-прежнему не работает.   -  person Nooobody    schedule 06.10.2012
comment
Просто сделал конструктор копии моего класса закрытым, безрезультатно. Все еще жалуюсь на CObject.   -  person Nooobody    schedule 06.10.2012
comment
@Nooobody: я гарантирую, что сообщения об ошибках покажут вам, какая строка вашего кода вызывает проблему. Посмотрите на окно вывода, а не на окно ошибок, и найдите, какие строки вашего кода в нем упоминаются.   -  person ildjarn    schedule 06.10.2012
comment
^ imageshack.us/a/img687/7088/outputu.png   -  person Nooobody    schedule 06.10.2012
comment
@Nooobody: это выглядит как довольно высокая полоса прокрутки. ;-] Есть ли другие ошибки, кроме этой?   -  person ildjarn    schedule 06.10.2012
comment
Всего около 27 предупреждений о том, что преобразование из UINT в число с плавающей запятой может привести к потере данных.   -  person Nooobody    schedule 06.10.2012


Ответы (2)


Если вы хотите, чтобы несколько потоков синхронизировались в CRITICAL_SECTION, вы можете поделиться указателем на один и тот же критический раздел, но на самом деле вы не можете сделать копию CRITICAL_SECTION.

person snowdude    schedule 05.10.2012
comment
Я делюсь указателем на класс, у которого есть указатель на CriticalSection, поэтому копирование не выполняется. Прокомментировал другие потоки вне кода, безрезультатно. - person Nooobody; 06.10.2012

Там тоже был CEvent, поэтому я подумал, что тоже сделаю его указателем, и что вы знаете. Это устранило эту проблему. Теперь есть файл afxmt.h, дающий мне исключения.

person Nooobody    schedule 06.10.2012