倾城笑颜 2015-08-23 14:28 采纳率: 0%
浏览 1916
已结题

连续调用PostThreadMessage只能响应一次线程函数,若放置messagebox就没问题

void MDDialog::OnButton4() //界面的一个普通按钮触发事件
{
int count = 0;

while (count < 5)
{

        if(!PostThreadMessage(m_dwPrintId,0,0,0))//post thread msg向线程函数发出消息
        {
            AfxMessageBox("post message failed,errno:%d\n",::GetLastError());

        }else
        {   
            // AfxMessageBox("send success");//post成功则执行此处

        }
   // ::Sleep(500);
    count++;
    }

}

_----------------------------------------------------------------------------------问题是,while循环5次,if判断后 每次都是执行到发送成功的,但是实际情况是线程响应函数只接受到一次消息,但我明明连续执行了5次,按道理线程函数里接受5次消息的呀,最后我在postThreadMessage之间加了弹出框,即每次post间加AfxMessageBox()后, 相对应的线程函数里的消息循环里就能循环5次了。why

------------------------------------------------------------------------------------以下是线程函数,正常情况我postThreadMessage多少次,我的线程函数while循环
里就应该执行多少次,因为GetMessage(&msg,NULL,0,0)按道理是能捕获我post出去的消息的,现在的状况就是只执行一次while循环体,但是我若在多次PostThreadMessage间加MessageBox弹窗,就能保证我能GetMessage多少次,否则只能有一次效果,用Sleep间隔多个PostThreadMessage也没效果,线程函数也是只能捕获一次。---------------------------------------------------------------------------------------------------------------------------------------------------------------------

DWORD WINAPI PrintOutMd(LPVOID lpParameter) //行情输出打印线程函数
{ AfxMessageBox("PrintOutMd");
int a = 0;
CString s ="";
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
BOOL bRes = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
if (bRes)
{
//在这里处理本线程的消息。

        s.Format("%d--有消息处理", a++);
             AfxMessageBox(s);
        }else
        {
             AfxMessageBox(_T("CThreadMsg::Run() 无消息处理/r/n"));
        }

    }

return 1  ;

}__

  • 写回答

3条回答 默认 最新

  • 倾城笑颜 2015-08-23 14:34
    关注

    如果我将弹窗AfxMessageBox("send success");换成Sleep(500),同样while循环执行5次,
    post用if判断也是走send success条件语句,同样延时了,

    还是不能保证我的线程函数消息队列接受到5次响应,

    以下为我的线程函数:
    DWORD WINAPI PrintOutMd(LPVOID lpParameter) //行情输出打印线程函数
    { AfxMessageBox("PrintOutMd");
    int a = 0;
    CString s ="";
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
    BOOL bRes = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
    if (bRes)
    {
    //在这里处理本线程的消息。

            s.Format("%d--有消息处理", a++);
                 AfxMessageBox(s);
            }else
            {
                 AfxMessageBox(_T("CThreadMsg::Run() 无消息处理/r/n"));
            }
    
        }
    
    return 1  ;
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器