многопоточность — mfc c ++ отправляет пользовательское сообщение с postmessage из рабочего потока в основной поток пользовательского интерфейса

Использование Visual Studio 2015 (Community Edition) & Проект MFC C ++. У меня есть работник
поток, где я хочу использовать функцию PostMessage () для отправки данных из этого потока в основной поток пользовательского интерфейса (где находится мой CDialog), но в том же классе, что я
хочу получить это сообщение.

В файле MyComm.h у меня есть следующее:

#define WM_USERRESPONSE WM_APP + 2000

class MyComm: public CDialog
{
...
CWnd* m_pParent;
static BOOL m_bThreadKill;
static CWinThread* pThread;
static CEvent* pEvent;
static CEvent m_ThreadKillEvent;
...
static UINT MyThreadProc(LPVOID pParam);
...
afx_msg LRESULT OnResponse(WPARAM wParam, LPARAM lParam);
...
};

В моем файле MyComm.cpp у меня есть следующее:

MyComm::MyComm(CWnd* pParent /*=NULL*/)
: CDialog(IDD_PPAGE_COMMAND, pParent)
{
m_pParent = pParent;

pEvent = new CEvent(FALSE, FALSE);

if ((pThread = AfxBeginThread(MyThreadProc, this)) == NULL)
AfxMessageBox("Could not Create Read Thread!");

pThread->m_bAutoDelete = FALSE;
m_ThreadKillEvent.ResetEvent();
m_ReadThreadDead.ResetEvent();
running = 1;
}

UINT MyComm::MyThreadProc(LPVOID pParam)
{
MyComm *pMyHndl = ((MyComm*)pParam);
string s = "I would like this string posted";
BOOL b = false;

b = ::PostMessage(pMyHndl->GetSafeHwnd(), WM_USBRDRESPONSE, 0,
(LPARAM)&s);
}

BEGIN_MESSAGE_MAP(MyComm, CDialog)
ON_MESSAGE(WM_USERRESPONSE, &MyComm::OnResponse)
END_MESSAGE_MAP()

afx_msg LRESULT MyComm::OnResponse(WPARAM wParam, LPARAM lParam)
{
MyStruct* p = (MyStruct*)lParam;
...
}

Обратите внимание, я сократил некоторые из них, чтобы остаться в теме.

При отладке этого (кода гораздо больше, чем этот) я проверяю, что поток запускается, я выполняю эту функцию PostMessage (), которая возвращает true. Я никогда не доберусь до
функция OnResponse (), предназначенная для получения. я не уверен
Зачем..(??)..

Некоторые мысли Это правда, что класс MyComm находится в том же классе, но
не ветка диалога, но порождается ею и является производной от CDialog. это
может быть не достаточно ?? Я признаю, я все еще несколько новичок в потоках через MFC
парадигма программирования. Любая помощь приветствуется.

Бешеный пес

0

Решение

  • Переменная string s не будет существовать после завершения потока. Показанная вами функция потока слишком мала и скоро завершится.
  • В идеале вы должны начать новую тему с OnInitDialog не в конструкторе. Цикл сообщений создается не в конструкторе, а в то время как в OnInitDialog,
  • Проверьте правильность кода сообщения. Ваш код имеет оба: WM_USBRDRESPONSE а также WM_USBRDRESPONSE
0

Другие решения

Сегодня я нашел ответ на эту проблему.

Это потому, что класс, в котором запускается поток, не является классом, привязанным к
окно еще, порождается одним с окном. Итак, тонкий нюанс pMyHndl
является необходимым. Если в POSTMESSAGE() Я вместо этого использую pMyHndl->m_pParent
вместо того, где m_pParent указывает на родительский класс (один с окном).
Этот код получал сообщение теперь, когда код для получения сообщения
был перемещен туда. Спасибо всем за помощь.

бешеный пес

0

По вопросам рекламы [email protected]