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

倾城笑颜 2015-08-23 11:08:22
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,加了弹出框就行,一开始以为是时间问题,将弹出框换成Sleep,还是执行一次。
----------------------------------------------------------------------------------------------------------------------
以下是线程函数,正常情况我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 ;
}
...全文
333 17 打赏 收藏 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2015-08-26
  • 打赏
  • 举报
回复
引用 16 楼 u013255206 的回复:
[quote=引用 13 楼 pcradio 的回复:] [quote=引用 7 楼 u013255206 的回复:] [quote=引用 6 楼 pcradio 的回复:]
while(GetMessage(&msg,NULL,0,0))
你PostThreadMessage发送的uMsg 是0也就是WM_QUIT,看看你的while判断,接收到一个WM_QUIT就直接退出while了,你觉得呢
GetMessage(&msg,NULL,0,0)在这里只是判断PostThreadMessage有没有发送的uMsg,判断收到的是什么消息是 uMsg.message == (消息名) 。 我前面说过,在多个PostThreadMessage(post5次)之间放置MessageBox()弹窗,线程函数里的while(GetMessage(&msg,NULL,0,0))就循环了5次,这是肯定没有退出while的,但是没有弹窗就只有一次,用Seelp(1000)代替也只是接收到一次消息。[/quote] GetMessage收到WM_QUIT它还不会退出,你是在逗我么,AfxMessageBox会另起消息循环,你考虑到了么?![/quote] AfxMessageBox确实影响了,调试发现,没有弹窗,消息队列是可以接收到每次post过来的消息的,只不过用了弹窗,就不会接受每次的post消息[/quote] messagebox会阻塞原消息循环的while并另开消息循环,这样就拦截了消息
倾城笑颜 2015-08-26
  • 打赏
  • 举报
回复
引用 13 楼 pcradio 的回复:
[quote=引用 7 楼 u013255206 的回复:] [quote=引用 6 楼 pcradio 的回复:]
while(GetMessage(&msg,NULL,0,0))
你PostThreadMessage发送的uMsg 是0也就是WM_QUIT,看看你的while判断,接收到一个WM_QUIT就直接退出while了,你觉得呢
GetMessage(&msg,NULL,0,0)在这里只是判断PostThreadMessage有没有发送的uMsg,判断收到的是什么消息是 uMsg.message == (消息名) 。 我前面说过,在多个PostThreadMessage(post5次)之间放置MessageBox()弹窗,线程函数里的while(GetMessage(&msg,NULL,0,0))就循环了5次,这是肯定没有退出while的,但是没有弹窗就只有一次,用Seelp(1000)代替也只是接收到一次消息。[/quote] GetMessage收到WM_QUIT它还不会退出,你是在逗我么,AfxMessageBox会另起消息循环,你考虑到了么?![/quote] AfxMessageBox确实影响了,调试发现,没有弹窗,消息队列是可以接收到每次post过来的消息的,只不过用了弹窗,就不会接受每次的post消息
zhusg 2015-08-25
  • 打赏
  • 举报
回复
看下这个http://blog.csdn.net/thefutureisour/article/details/8155888
schlafenhamster 2015-08-25
  • 打赏
  • 举报
回复
uMsg 是0 ;也就是WM_NULL
阿源是少年 2015-08-24
  • 打赏
  • 举报
回复
while(GetMessage(&msg,NULL,0,0))
你PostThreadMessage发送的uMsg 是0也就是WM_QUIT,看看你的while判断,接收到一个WM_QUIT就直接退出while了,你觉得呢
阿源是少年 2015-08-24
  • 打赏
  • 举报
回复
你Post WM_QUIT消息吗?接收方如何处理的?
schlafenhamster 2015-08-24
  • 打赏
  • 举报
回复
通常 BOOL bRes = PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
schlafenhamster 2015-08-24
  • 打赏
  • 举报
回复
DWORD WINAPI PrintOutMd(LPVOID lpParameter) //行情输出打印线程函数 { AfxMessageBox("PrintOutMd"); 应该使用 afxDump << "PrintOutMd\n"; 以避免 MessageBox 打扰 消息 处理
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
The PostThreadMessage function places (posts) a message in the message queue of the specified thread and then returns without waiting for the thread to process the message. 也就是说调用PostThreadMessage函数,该函数会把一个消息放在指定线程的消息对列里,只要线程存在,一般都返回非零 当你用while循环5次时,已经向指定线程发送了五个这样的消息,只不过指定线程来不及处理,只处理了一个
阿源是少年 2015-08-24
  • 打赏
  • 举报
回复
引用 7 楼 u013255206 的回复:
[quote=引用 6 楼 pcradio 的回复:]
while(GetMessage(&msg,NULL,0,0))
你PostThreadMessage发送的uMsg 是0也就是WM_QUIT,看看你的while判断,接收到一个WM_QUIT就直接退出while了,你觉得呢
GetMessage(&msg,NULL,0,0)在这里只是判断PostThreadMessage有没有发送的uMsg,判断收到的是什么消息是 uMsg.message == (消息名) 。 我前面说过,在多个PostThreadMessage(post5次)之间放置MessageBox()弹窗,线程函数里的while(GetMessage(&msg,NULL,0,0))就循环了5次,这是肯定没有退出while的,但是没有弹窗就只有一次,用Seelp(1000)代替也只是接收到一次消息。[/quote] GetMessage收到WM_QUIT它还不会退出,你是在逗我么,AfxMessageBox会另起消息循环,你考虑到了么?!
schlafenhamster 2015-08-24
  • 打赏
  • 举报
回复
Remarks The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. Use one of the following methods to handle this situation: Call PostThreadMessage. If it fails, call theSleep function and call PostThreadMessage again. Repeat until PostThreadMessage succeeds. Create an event object, then create the thread. Use theWaitForSingleObject function to wait for the event to be set to the signaled state before calling PostThreadMessage. In the thread to which the message will be posted, call PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) to force the system to create the message queue. Set the event, to indicate that the thread is ready to receive posted messages. The thread to which the message is posted retrieves the message by calling the GetMessage or PeekMessage function. The hwnd member of the returned MSG structure is NULL.
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
楼主,你有给线程创建消息队列么 调用PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)消息将寄送到的线程通过调用GetMesssge或PeekMesssge来取得消息。
倾城笑颜 2015-08-24
  • 打赏
  • 举报
回复
我窗体初始化时就创建了线程,已经调用了线程函数一次,AfxMessageBox("PrintOutMd");弹窗也弹出来了,线程函数会阻塞在 while(GetMessage(&msg,NULL,0,0)){} 一直等待消息,也就是说有消息线程函数才会while循环一次,这就跟我加了 AfxMessageBox("PrintOutMd")没啥关系吧,毕竟这个语句是在while(GetMessage(&msg,NULL,0,0))外面,只在线程创建时执行过一次,线程函数一旦遇到PostThreadMessage发过来的消息,都是从·while(GetMessage(&msg,NULL,0,0)里执行的了。
倾城笑颜 2015-08-24
  • 打赏
  • 举报
回复
这是我窗体一开始初始化就创建线程语句 ----------------------------------------------------------------- BOOL MDDialog::OnInitDialog() { //创建行情输出线程 m_hPrintThread = CreateThread( NULL,0,PrintOutMd,(LPVOID)this,0,&m_dwPrintId); if (m_hPrintThread == NULL) { MessageBox("创建线程失败!"); } ****** }
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
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 ; } 你的响应函数里不是有 AfxMessageBox么,会不会弹出消息框后,引发该线程阻塞
倾城笑颜 2015-08-24
  • 打赏
  • 举报
回复
引用 2 楼 ant2012 的回复:
The PostThreadMessage function places (posts) a message in the message queue of the specified thread and then returns without waiting for the thread to process the message. 也就是说调用PostThreadMessage函数,该函数会把一个消息放在指定线程的消息对列里,只要线程存在,一般都返回非零 当你用while循环5次时,已经向指定线程发送了五个这样的消息,只不过指定线程来不及处理,只处理了一个
我用Sleep(1000)为什么还不能保证线程来处理接受的消息呢,这跟用messagebox阻塞延时有什么区别吗,还有其他可能原因吗
倾城笑颜 2015-08-24
  • 打赏
  • 举报
回复
引用 6 楼 pcradio 的回复:
while(GetMessage(&msg,NULL,0,0))
你PostThreadMessage发送的uMsg 是0也就是WM_QUIT,看看你的while判断,接收到一个WM_QUIT就直接退出while了,你觉得呢
GetMessage(&msg,NULL,0,0)在这里只是判断PostThreadMessage有没有发送的uMsg,判断收到的是什么消息是 uMsg.message == (消息名) 。 我前面说过,在多个PostThreadMessage(post5次)之间放置MessageBox()弹窗,线程函数里的while(GetMessage(&msg,NULL,0,0))就循环了5次,这是肯定没有退出while的,但是没有弹窗就只有一次,用Seelp(1000)代替也只是接收到一次消息。
该数据集名为“6200印章数据集-圆椭方矩-红蓝灰”,包含6200多张印章图像,涵盖圆形、椭圆形、方形和矩形四种几何形状,并包含红色、蓝色和灰色三种颜色。其目标是服务于印章识别、印章文本识别以及印章OCR技术的研究与开发。由于形状和颜色种类丰富,该数据集有助于开发者训练出适应性更强的识别系统,以应对不同应用场景。 这些印章图像均为真实印章的高清照片,能够为印章识别算法提供充足的视觉信息。不过,该数据集不包含预标注的地面真实(GT)标签,因此开发者在使用时可能需要进行一定的数据清洗和标注,才能满足模型训练要求。尽管增加了额外工作量,但其规模和多样性仍使其成为重要的研究资源。 印章识别技术广泛应用于文档审核、版权验证、金融交易验证等领域。随着机器学习和深度学习不断发展,印章识别算法已从简单的模板匹配逐渐转向更复杂的图像处理和模式识别方法。这一进步需要大量高质量训练数据,而此类数据集正是满足这一需求的关键工具之一。 考虑到印章识别在实际应用中会遇到磨损、变形以及复杂背景等问题,该数据集在设计时也兼顾了这些现实挑战。通过提供不同形状和颜色的印章图像,它有助于研究者开发出能够应对真实世界复杂情况的算法。同时,由于缺乏GT标签,研究者在训练模型前还需解决如何高效、准确地进行图像标注的问题,这既提高了研究难度,也带来了更贴近实际应用的挑战与机会。 “6200印章数据集-圆椭方矩-红蓝灰”是一个面向印章识别技术的综合性训练数据集。它的推出对推动印章识别技术发展具有重要意义。通过有效利用该数据集,开发者可以构建更强大、更准确的印章识别系统,进一步促进相关技术的落地应用。
源码下载地址: https://pan.quark.cn/s/ae487cba003d 在计算机视觉与图像处理技术领域中,OpenCV作为一个被广泛采纳的开源框架,提供了大量的函数和工具,用于对图像进行操作和分析。本篇文章将深入阐释OpenCV在处理含有RGBA通道的图像时的应用,以及如何进行通道的分离与融合。 让我们首先掌握RGBA图像的基本构成。RGB分别象征红色(Red)、绿色(Green)以及蓝色(Blue),这三种颜色的不同强度组合能够产生多样的色彩效果。而A则代表Alpha通道,它用来指示图像的透明程度或完全不透明性。在0至255的数值区间内,0值代表完全透明,255值则表示完全不透明。当处理PNG等支持透明特性的图像格式时,RGBA模型被频繁使用。 在OpenCV软件中,我们可以借助`cv::Mat`结构体来储存和操作图像数据。对于RGBA图像,`cv::Mat`结构体的数据类型通常是`CV_8UC4`,这表明每个像素点由4个8位无符号整数(Uint8)构成,分别对应R、G、B和A四个通道。 接下来,我们将讨论如何从RGBA图像中分离各个通道。在OpenCV中,`cv::split()`函数能够实现这一功能。该函数会构建一个新的`cv::Mat`数组,数组中的每个元素都是原图像的一个独立通道。例如: ```cpp cv::Mat rgbaImage; // 加载RGBA图像 cv::imread("image.png", cv::IMREAD_UNCHANGED); // 分离通道 std::vector channels; cv::split(rgbaImage, channels); cv::Mat redChannel = ...
代码转载自:https://pan.quark.cn/s/a4b39357ea24 在信息技术领域,"后处理"一般是指在计算机辅助设计(CAD)或计算机辅助制造(CAM)系统中,将设计图纸转化为机器设备操作指令的过程。在此情形下,"佳铁雕刻机后处理.rar"是一个压缩文件,其中存放了与佳铁雕刻机相关的后处理工具或配置数据。佳铁雕刻机是一种常见的数字控制机床,主要用于精细的雕刻和加工作业,比如电脑锣、精雕机或雕铣机等设备。 雕刻机后处理包含的核心知识要点有: 1. **数字控制(NC)代码的编制**:当在CAD/CAM软件中完成工件设计后,需要将其转换为机床能够识别的数字控制指令。这一步骤即为后处理,它将三维设计转化为一系列的G代码和M代码,这些指令指导雕刻机的刀具如何移动。 2. **后处理器的个性化设置**:由于不同的雕刻机可能配备不同的控制系统和机械属性,因此需要专门设计的后处理器来适配这些特性。针对佳铁雕刻机的后处理器可能包含特定的参数调整,例如进给速率、切削深度、刀具路径优化等,以实现最佳的加工效果和效率。 3. **G代码与M代码的应用**:G代码是控制刀具运动的指令,例如G00表示快速移动,G01表示线性插补,G02和G03分别代表顺时针和逆时针的圆弧插补;M代码则是辅助操作指令,如M03代表主轴正转,M05代表主轴停转。这些指令的组合构成了完整的加工程序。 4. **机床参数设定**:后处理流程会考虑到机床的具体参数,包括电机类型、丝杠螺距、工作台尺寸等,以确保生成的NC代码与实际设备相符。 5. **刀具路径的优化**:高效的后处理能够改进刀具的运动轨迹,减少无效运行时间,提升生产效率,同时避免刀具与工件的碰撞以及工件形变,确保加工的精确度。...

15,465

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧