使用Visual Studio 2015(社区版)& MFC C ++项目。我有一个工人 线程我希望使用PostMessage()函数将数据从这个线程发送到主UI线程(我的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;
...
}
注意我将其中一些缩写为主题。
在调试它时(代码比这个多得多),我验证线程是否启动,我执行这个返回true的PostMessage()函数。我从来没有去过 打算作为收件人的OnResponse()函数。我不确定 为什么..(??)..
一些想法。确实,MyComm类属于同一类 不是对话框线程,而是由它产生并且是从CDialog派生的。这个 可能还不够?我承认,我通过MFC对线程仍然有些新意 编程范式。任何帮助表示赞赏。
Maddog
答案 0 :(得分:0)
xlWS.Range("A1").Select
Dim rst as DAO.Recordset, fld as Variant
Set rst = CurrentDB.OpenRecordset(TableOrQueryNameOrSELECTstatement)
For Each fld In rst.Fields
ApXL.Application.ActiveCell = fld.Name
ApXL.Application.ActiveCell.Offset(0, 1).Select
Next
rst.MoveFirst
xlWSh.Range("A2").CopyFromRecordset rst
XlWb.Save
将不存在。您显示的线程功能太小,很快就会退出。string s
开始新的线程,而不是在构造函数中。消息循环不是在构造函数中创建的,而是在OnInitDialog
。OnInitDialog
和WM_USBRDRESPONSE
答案 1 :(得分:0)
今天,我确实找到了这个问题的答案。
这是因为启动线程的类不是绑定到的类
窗口,由一个窗口产生的窗口。 pMyHndl
上的微妙细微差别
有必要的。如果在POSTMESSAGE()
我改为使用pMyHndl->m_pParent
代替m_pParent指向Parent类的位置(一个带窗口)。
此代码现在接收消息,即接收消息的代码
被移到那里。感谢所有人的帮助。
maddog