Как я могу показать немодальное диалоговое окно и отобразить информацию в ней сразу?

Если вы используете expo, то он поддерживает аудио, вы можете увидеть в документации здесь: https://docs.expo.io/versions/v32.0.0/sdk/audio

Однако, если вы не используете expo и создали свое приложение с react-native init, вам нужно будет использовать зависимость, которая имеет собственные модули, или написать свой собственный собственный модуль, так как обработка аудио в потоке javascript будет заблокировать ваше приложение и сделать его непригодным для использования.

6
задан Jason Plank 14 November 2011 в 14:09
поделиться

4 ответа

Как показывает опыт, тяжелые вычисления никогда не должны помещаться в поток GUI. Так как это - немодальное диалоговое окно, диалоговое окно не будет владеть циклом сообщения. ProcessMessage () решение будет работать, но является IMO не правильный путь. Мое предложение: 1) Икра, новый поток в OnInitDialog () 2) Имеет отдельный поток, добавляет сообщения к диалоговому окну, когда что-то интересное происходит. Одна из этих интересных вещей - то, что работа сделана.

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

2
ответ дан 8 December 2019 в 17:28
поделиться

В OnInitDialog запустите рабочий поток для выполнения вычислений. Добавьте пользовательское сообщение от рабочего потока для обновления диалогового окна.

Это превосходит реализацию ProcessMessages по нескольким причинам:

  • Код для того, чтобы сделать вычисления может быть разделен из кода UI, где он не принадлежит.

  • UI остается быстро реагирующим, в то время как фактические вычисления выполняются. ProcessMessages позволяет несколько обновлений UI во время единственной функции вычисления, но UI будет все еще заблокирован во время фактических вычислений.

Диалоговый код:

#define WM_NEW_COUNT (WM_USER + 0x101)

BEGIN_MESSAGE_MAP()
    ON_MESSAGE(WM_NEW_COUNT, OnNewCount)
END_MESSAGE_MAP()

BOOL CMyDialog::OnInitDialog()
{
    CWinThread* pThread = AfxBeginThread(MyCountFunc, this->GetSafeHwnd());
    return TRUE;
}

LRESULT CMyDialog::OnNewCount(WPARAM wParam, LPARAM)
{
    int newCount = (int)wParam;

    // m_count is DDX member, e.g. for label
    m_count = newCount;

    UpdateData(FALSE);

    return 0;
}

Рабочий поток:

UINT MyCountFunc(LPVOID lParam)
{
    HWND hDialogWnd = (HWND)lParam;

    for (int i=0; i < 100; ++i)
    {
        PostMessage(hDialogWnd, WM_NEW_COUNT, i, NULL);
    }
}
5
ответ дан 8 December 2019 в 17:28
поделиться

Существует несколько вещей, которые можно сделать.

(1) Вы могли отправить диалоговое окно сообщение из CDialog:: метод OnInitDialog и затем обрабатывает долгую функцию в обработчике сообщений того добавленного сообщения. Тем путем диалоговое окно будет сначала отображено, и затем позже долгая функция будет выполнена.

(2) Вторая опция состоит в том, чтобы удостовериться, что цикл сообщения получает некоторое время обработки. Таким образом, если Ваша долгая функция является своего рода циклом, просто добавляют случайный вызов к ProcessMessages, чтобы удостовериться, что очередь сообщений сохранена пустой:

void ProcessMessages()
{
    MSG msg;
    CWinApp* pApp = AfxGetApp();
    while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
    {
        pApp->PumpMessage();
    }
}

Править: Конечно, возможно использовать потоки, такая ситуация, но выполнение так не всегда без риска и сложности.

Используя потоки со средствами GUI иметь необходимость иметь дело с несколькими очередями сообщений, который затем означает использовать API как PostThreadMessage и это представляет новый набор проблем для опасаний.

Поскольку пример одной такой проблемы обращается к этой ссылке:

http://msdn.microsoft.com/en-us/library/ms644946 (По сравнению с 85) .aspx

то, где, говорит:

Сообщения, отправленные PostThreadMessage, не связаны с окном. Как правило сообщения, которые не связаны с окном, не могут быть диспетчеризированы функцией DispatchMessage. Поэтому, если поток получателя будет в модальном цикле (как используется MessageBox или DialogBox), то сообщения будут потеряны. Для прерывания сообщений потока в то время как в модальном цикле используйте определенный для потока рычаг.

Я использую подход сообщения процесса в IDE Zeus, и он работает очень хорошо при проверке, что GUI остается быстро реагирующим пользователю. Это, также имеет преимущество того, чтобы быть очень легким реализовать.

6
ответ дан 8 December 2019 в 17:28
поделиться

Не пытайтесь сделать свою тяжелую работу внезапно. Имейте само диалоговое сообщение сообщение в диапазоне WM_APP в OnInitDialog. Обработчик WM_APP может внести свой вклад тяжелой работы, затем сделать другой PostMessage и возврат. Таким образом Вы позволяете насосу сообщения обрабатывать сообщения окна, промежуточные Ваши блоки обработки.

1
ответ дан 8 December 2019 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: