Статический указатель не инициализируется в процедуре подкласса окна? - PullRequest
0 голосов
/ 11 июля 2011

Я запутался, почему второй статический указатель pthis не инициализируется? Я подкласс оконной процедуры через статическую функцию. Первый статический указатель lpProcess был инициализирован в основной процедуре. Однако второй даже не вызовет свой собственный конструктор (я использовал отладчик для определения этой проблемы). Так или иначе, это просто пропускает строительство. Сначала я сомневаюсь, что неправильно понял некоторые моменты статической переменной. Однако, увидев, что первый работает, почему не второй? Возможно, я предполагаю, что это как-то связано с глубокой рекурсией или вызовом статической функции?

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static QProcessor* lpProcess = new QProcessor(hwnd); //Initialized without any error

    switch(msg)
    {

    case WM_CREATE:
        {
            lpProcess->SetFixed(322,200); //Set window size through the container
            lpProcess->Update(); //Update members
            if(!lpProcess->CreateChild()) //Create all controls
            {
                Error(); //print error
                ::DestroyWindow(hwnd); //terminate the window
            }
            QMonitor::Attach(hwnd); //Attach Monitor Window to current window

        }
....




void QMonitor::Attach(HWND hwnd)
{
    QMonitor::classdata = (LPVOID)::SetWindowLong(hwnd,GWL_WNDPROC,(LONG)QMainProc); //subclass procedure
}




LRESULT CALLBACK QMainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static QMonitor* pthis = new QMonitor(hwnd); //Won't initialize??

    switch(msg)
        {
        case WM_MOVE:
            {
                pthis->OnMove();
            }
            break;
        case WM_SIZE:
            {
                pthis->OnSize();
            }
            break;
        case WM_COMMAND:
            break;
        case WM_DESTROY:
            delete pthis;
            break;
        }
        return ::CallWindowProc(pthis->GetAttachWndProc(),hwnd,msg,wParam,lParam);
}

1 Ответ

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

Большинство компиляторов C ++ выдают небольшую "преамбулу" кода для процедур, которые имеют статические данные, подобные этой. Эта преамбула проверяет (скрытый) логический флаг и инициализирует / создает статику, если она ясна. Затем устанавливается логический флаг, указывающий, что статика не должна быть снова инициализирована.

Не все компиляторы управляют этими флагами потокобезопасным способом, поэтому несколько потоков, пытающихся инициализировать одну и ту же статику, могут вызвать хаос ...

Если ваш конструктор не вызывается, возможно, это логическое значение повреждено чем-то другим в вашем коде?

Извините, я не могу решить проблему напрямую, но, надеюсь, это поможет вам понять часть кода сборки, который вы видите выполняющимся в отладчике ...

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