Как изменить текст области строки состояния от потока в MFC?

AFAIK, в Vb.Net нет ассоциативных массивов. Я думаю, что вы должны использовать словарь со строкой в ​​качестве ключа.

Инициализация должна выглядеть следующим образом:

Dim myNewDictionary As new Dictionary(Of string, string)

Тогда вы можете просто добавить к нему элементы, используя .add ():

myNewDictionary.Add("someStringAsKey", "someStringAsValue")

Документы Microsoft о Словаре: [112 ] https://docs.microsoft.com/es-es/dotnet/api/system.collections.generic.dictionary-2?view=netframework-4.7.2

PS. Извините за любые опечатки или опечатки, английский не мой основной язык.

6
задан 2 revs, 2 users 100% 28 July 2009 в 09:46
поделиться

3 ответа

Вы могли добавить личное сообщение к основному рамочному окну и 'попросить', чтобы это обновило строку состояния. Потоку был бы нужен дескриптор главного окна (не используйте объект CWnd, поскольку это не будет ориентировано на многопотоковое исполнение). Вот некоторый пример кода:

static UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam);

void CMainFrame::OnCreateTestThread()
{
    // Create the thread and pass the window handle
    AfxBeginThread(UpdateStatusBarProc, m_hWnd);
}

LRESULT CMainFrame::OnUser(WPARAM wParam, LPARAM)
{
    // Load string and update status bar
    CString str;
    VERIFY(str.LoadString(wParam));
    m_wndStatusBar.SetPaneText(0, str);
    return 0;
}

// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
    const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
    ASSERT(hMainFrame != NULL);
    ::PostMessage(hMainFrame, WM_USER, IDS_STATUS_STRING);
    return 0;
}

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

Вместо использования WM_USER Вы могли зарегистрировать свое собственное сообщение Windows:

UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));

Сделайте выше статического члена CMainFrame например.

Если использование строковых ресурсов является слишком основным, затем имеют поток, выделяют строку на "куче" и удостоверяются, что функция обновления CMainFrame удаляет его, например:

// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
    const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
    ASSERT(hMainFrame != NULL);
    CString* pString = new CString;
    *pString = _T("Hello, world!");
    ::PostMessage(hMainFrame, WM_USER, 0, reinterpret_cast<LPARAM>(pString));
    return 0;
}

LRESULT CMainFrame::OnUser(WPARAM, LPARAM lParam)
{
    CString* pString = reinterpret_cast<CString*>(lParam);
    ASSERT(pString != NULL);
    m_wndStatusBar.SetPaneText(0, *pString);
    delete pString;
    return 0;
}

Не прекрасный, но это - запуск.

5
ответ дан 10 December 2019 в 00:45
поделиться

Необходимо использовать сообщение (или с, Отправляют - или PostMessage) уведомлять поток UI, что текст строки состояния должен быть обновлен. Не пытайтесь обновить элементы UI от рабочего потока, он обязан причинить Вам боль.

2
ответ дан 10 December 2019 в 00:45
поделиться

Возможно, это может помочь Вам: Как получить доступ к элементам UI от потока в MFC.

Я не кодирую C++ / MFC сам, но я испытал подобную проблему в C#, который известен как перекрестный поток обновление GUI.

3
ответ дан 10 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

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