Использование 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
парадигма программирования. Любая помощь приветствуется.
Бешеный пес
string s
не будет существовать после завершения потока. Показанная вами функция потока слишком мала и скоро завершится.OnInitDialog
не в конструкторе. Цикл сообщений создается не в конструкторе, а в то время как в OnInitDialog
,WM_USBRDRESPONSE
а также WM_USBRDRESPONSE
Сегодня я нашел ответ на эту проблему.
Это потому, что класс, в котором запускается поток, не является классом, привязанным к
окно еще, порождается одним с окном. Итак, тонкий нюанс pMyHndl
является необходимым. Если в POSTMESSAGE()
Я вместо этого использую pMyHndl->m_pParent
вместо того, где m_pParent указывает на родительский класс (один с окном).
Этот код получал сообщение теперь, когда код для получения сообщения
был перемещен туда. Спасибо всем за помощь.
бешеный пес