我的线程函数是视类的成员函数,定义为了static类型我是这样自定义消息的:
1、在视类的头文件中定义消息#define WM_MYMSG WM_USER+1000
2、在视类头文件 DECLARE_MESSAGE_MAP()中定义消息响应函数 afx_msg LONG OnReceiveEvent(WPARAM wParam,LPARAM lparam);
3、在视类的源文件里面添加消息映射:
BEGIN_MESSAGE_MAP(CPC2PCView, CEditView) ON_MESSAGE(WM_MYMSG,OnReceiveEvent)
END_MESSAGE_MAP()
这个样子定义消息可以吗?为什么我的消息貌似没有传递过来呢?
1、在视类的头文件中定义消息#define WM_MYMSG WM_USER+1000
2、在视类头文件 DECLARE_MESSAGE_MAP()中定义消息响应函数 afx_msg LONG OnReceiveEvent(WPARAM wParam,LPARAM lparam);
3、在视类的源文件里面添加消息映射:
BEGIN_MESSAGE_MAP(CPC2PCView, CEditView) ON_MESSAGE(WM_MYMSG,OnReceiveEvent)
END_MESSAGE_MAP()
这个样子定义消息可以吗?为什么我的消息貌似没有传递过来呢?
解决方案 »
- 请教大家关于 Codejock的问题
- tcp/ip网络编程的问题。
- DirectDr视频上画图,DirectDraw+GDI,画面闪??
- 急需各位帮忙,出现了winocc.cpp,279line的运行错误
- 程序每次运行都读某个文件夹下特写的一张位图文件.当位图文件改变时我程序里读的也改变了.怎么做?用到哪些函数?谢谢
- 怎么知道子进程出错?
- 一个关于编译链接的问题?
- 再开一贴!解决后200分同时送!关于非模式对话框如何不覆盖它的主对话框的问题!在线等!
- 急!怎样在文档/视图、对话框中镶入显示EXCEL或WORD文档,并且如何控制?
- VC2012把对读卡器的调用封装成ocx供网页调用怎么做
- 求助 msvcprtd.lib(MSVCP90D.dll) : error LNK2005
- GetExitCodeThread能检测到异常退出线程的状态吗?????????
CWnd* pDlg = (CWnd *) lParam; //lParam是传递过来的参数
PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
::PostMessage(hWnd,WM_MYMSG,0,(LPARAM)100);
我是在线程函数里面发送消息的
这样不能直接传递给LPARAM吗?
貌似不行啊!线程多是全局函数而且还必须是WINAPI。
同样地,在CPP文件里也最好放在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏对的外面。不过,你的写法如果编译不报错的话,应该没问题。
你是怎么创建线程的?把那句写出来看看!
AfxBeginThread(ThreadProc, GetSafeHwnd());
在线程函数里如下发送消息:
::PostMessage((HWND)pParam,WM_MYMSG,0,(LPARAM)100);
{{AFX_MSG_MAP(C×××)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
外面,
而在头文件里放在
{{AFX_MSG(C×××)
ON_WM_MOUSEMOVE()
//}}AFX_MSG
外面
sorry
void CPC2PCView::OnOpencom()
{
//打开串口操作
hCom=CreateFile(myCom,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(hCom!=INVALID_HANDLE_VALUE)
{
//成功打开串口,执行以下操作
SetupComm(hCom,1500,1500);//设置发送缓冲时间1.5s,接收缓冲时间1.5s
DCB myDCB;
GetCommState(hCom,&myDCB);//获取当前串口参数
myDCB.BaudRate=myBaudRate;
myDCB.fBinary=TRUE;
myDCB.fParity=myfParity;
myDCB.ByteSize=8;
myDCB.Parity=myParity;
myDCB.StopBits=ONESTOPBIT;
SetCommState(hCom,&myDCB);//设置串口通信参数
blnOpened=true;
//创建并立即执行线程函数
DWORD dwParam;
//设置允许的事件类型
if((!SetCommMask(hCom,EV_RXCHAR))|EV_TXEMPTY)
{
AfxMessageBox("建立事件掩码失败!");
}
hThreadEvent=CreateThread(NULL,//创建事件线程
0,
//指定线程函数名称
(LPTHREAD_START_ROUTINE)(ThreadProcEvent),
&dwParam,
0,//创建线程函数后,立即执行
&dwThreadID);
if(hThreadEvent==INVALID_HANDLE_VALUE)
{
AfxMessageBox("事件线程创建失败!");
}
fEventRun=true;//允许事件函数执行循环体
bytActStatus=10;//操作状态设为接收状态
bytSendStatus=0;//发送状态设为0态
bytRcvStatus=0;//接收状态设为0态
bytResendCount=0;//重发次数清零
uintStxCurNo=0;//当前发送数据序号清零 }
else
{
AfxMessageBox("创建串口失败!");
}}
0,
//指定线程函数名称
(LPTHREAD_START_ROUTINE)(ThreadProcEvent),
this,
0,//创建线程函数后,立即执行
&dwThreadID); 在线程中
CWnd* pDlg = (CWnd *) lParam; //lParam是传递过来的参数
PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
这个位置应该传入你要发消息的目标窗口
ASSERT(::IsWindow(pDlg->m_hWnd)); //这个看下有没有警告
PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
ASSERT(::IsWindow(pDlg->m_hWnd)); //这个看下有没有警告
PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
正解
但是监听的结果为什么老是超时呢?是不是我的监听函数有问题?
下面是我的监听函数
DWORD CPC2PCView::ThreadProcEvent(LPVOID pParam)
{DWORD dwEvtMask,dwRes;
bool fStopMsg;
CWnd* pDlg = (CWnd *) pParam;
Eol.hEvent = CreateEvent(NULL,TRUE, //设置Eol.hEvent成员为无信号状态
FALSE,NULL);
while(fEventRun)
{
WaitCommEvent(hCom,&dwEvtMask, //监视串口事件
&Eol);
dwRes = WaitForSingleObject(Eol.hEvent, //等待信号
1000);
switch(dwRes)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
{
switch(dwEvtMask)
{
case EV_RXCHAR: //接收到数据
{
if(!fStopMsg)
{
fStopMsg = true;
::PostMessage(pDlg->m_hWnd,WM_MYMSG, //向主线程发送消息,接收到数据
0,(LPARAM)1);
}
break;
}
case EV_TXEMPTY:
{
AfxMessageBox(_T("send buffer is empty"));
break;
}
}
}
case WAIT_TIMEOUT:
{
::PostMessage(pDlg->m_hWnd,WM_MYMSG,0,(LPARAM)100);
}
break;
}
return true; }
}
请各位再帮哈忙,多谢啦
1000);
换成无限等待试试,用GetLastError看是否有错误
dwRes = WaitForSingleObject(Eol.hEvent, //等待信号
INFINITE);
PostMessage也可以换成SendMessage试试。