Flink Пользовательская сериализация с registerTypeWithKryoSerializer

Правильный способ - использовать AfxBeginThread или std::thread::detach. Вы можете использовать диалог в основном потоке пользовательского интерфейса.

В качестве альтернативы вы можете сделать это в одном потоке, предполагая, что ваша функция может быть прервана и сломана в разные части. Например, предположим, что у вас есть функция, которая занимает 3 секунды:

Sleep(3000);

Она может быть разбита на 30 частей и смоделирована как

for (int i = 0; i < 30; i++) 
    Sleep(100);

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

void update_paint()
{
    MSG msg;
    while(PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE))
    {
        if(msg.message == WM_COMMAND && msg.wParam == IDCANCEL) { }//cancel reuested
        if(msg.message == WM_PAINT ||
            (msg.message >= WM_NCCALCSIZE && msg.message <= WM_NCACTIVATE) ||
            (msg.message >= WM_NCMOUSEMOVE && msg.message <= WM_NCMBUTTONDBLCLK))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}

void CMyDialog::single_thread()
{
    MessageBox(L"start");
    //disable child controls to let user know the dialog is busy
    for(CWnd *p = GetWindow(GW_CHILD); p; p = p->GetWindow(GW_HWNDNEXT))
        p->EnableWindow(FALSE);

    for(int i = 0; i < 30; i++)
    {
        Sleep(100);
        update_paint();
    }

    //enable child controls
    for(CWnd *p = GetWindow(GW_CHILD); p; p = p->GetWindow(GW_HWNDNEXT))
        p->EnableWindow(TRUE);
    MessageBox(L"done");
}

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

0
задан Carlo Medas 19 January 2019 в 10:12
поделиться

1 ответ

Так что текущий быстрый обходной путь - убедиться, что ваши объекты не POJO. В другом случае они не сериализуются через GenericType, который использует Kryo и видит ваши собственные сериализаторы.

Очень полезно для отладки, когда вы сталкиваетесь с такими проблемами: env.getConfig (). DisableGenericTypes ();

Это позволяет остановить запуск задачи с исключением, позволяя вам проверить, какие сериализаторы и Типы подсказок были использованы.

0
ответ дан Carlo Medas 19 January 2019 в 10:12
поделиться