- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
IT知识库 86GOD百科大字典
[IT知识库 / 未知 著 ]
书籍介绍:
IT知识库
------章节内容开始-------
第一卷 第一章
?单位线程是如何处理消息的
Windows的消息处理机制是用如下代码进行消息处理的:
MSG message;
While(::GetMessage(message,NULL,0,0)){
::TranslateMessage(message);
::DispatchMessage(message);
}
当消息到达时,由TranslateMessage进行必要的转换,例如:将WM_KEYDOWN消息转换为包含有ASCII字符的WM_CHAR消息,
然后由DispatchMessage进行发送,当处理完成后,DispatchMessage返回.
放弃控制
如果在等待方式下,DispatchMessage必须等待处理完成后才能返回,在此之前将不能处理任何消息,
而下面的代码可以做到即使没有消息到达程序的情况下也立即返回
MSG message;
While(::PeekMessage(message,NULL,0,0,PM_REMOVE)){
::TranslateMessage(message);
::DispatchMessage(message);
}
计时器是不依赖CPU的时钟速度的. 注意的是因为Windows并不是实时的操作系统,所以,如果你指定的周期小于100毫秒的话,
计时器事件之间的周期可能不精确.有了计时器,有时可以替代多线程情况, 例如下面的代码就允许在循环内仍然接收处理消息. 这是一个进度条,
在OnTimer里面改动进度条的显示, 同时可以自定义CANCEL消息, 在OnCancel中将程序终止.
Void CDlg::OnStart()
{
MSG message;
SetTimer(0,100,NULL);
GetDlgItem(IDC_START)-EnableWindow(FALSE); // 使按钮无效
Volatile int nTemp;//使变更不保存在寄存器中, 因为变量如果保存在寄存器中, 在线程的切换过程中可能会出现值的错误.
For (m_nCount=0;m_nCountnMaxCount;m_nCount++){
For (nTemp=0;nTemp10000;nTemp++){
………
}
if (::PeekMessage(message,NULL,0,0,PM_REMOVE)){
::TranslateMessage(message);anslateMessage(message);
::DispatchMessage(message);
}
}
CDlg::OnOK();// 线程结束后关闭对话框
}
第一卷 第二章
本章字数:1740
?编写工作者线程函数并启动线程
线程体一般是如何形式:
UINT ThreadProc(LPVOID pParam)
{
return 0;
}
启动线程使用:
CwinThread* pThread =
AfxBeginThread(ThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
主线程如何与工作线程使用全局变量通讯
全局变量通讯是最简单而有效的办法.
例如下面的代码:
UINT ThreadProc(LPVOID pParam)
{
g_nCount = 0;
while(g_nCount100)
::InterlockedIncrement((long*)g_nCount);
return 0;
}
InterLockIncrement函数在变量加1期间阻塞其他线程访问该变量.
如果不使用此函数而直接使用:g_nCount++的话, 可能会出现错误.
工作者线程与主线程通讯发送消息进行联络
下面的代码: 当线程完成后发送给父进程消息
UINT ThreadProc(LPVOID pParam)
{
………
::PostMessage((HWND)pParam,WM_THREADFINISHED,0,0);
return 0;
}
使用事件进行线程同步程同步
Cevent类是一个事件类,刚定义时处于非信号状态, 可以调用SetEvent()成员函数置它为信号状态.
下面的代码: 线程首先等待开始信号, 如果没有置开始信号会一直挂起等待, 同时在运行的过程中等待结束信号,
如果结束信号发生就终止线程.
Ceven
您可能关注的文档
最近下载
- 【靓仔资料库讲义】2025资料分析理论实战讲义(合集)(1).pdf VIP
- 1993年山东高考语文试卷真题及答案 .doc VIP
- 2025年美丽中国第六届全国国家版图(中小学组)知识竞赛题库及答案.doc VIP
- 科技驱动的滴滴出行营销模式研究.docx
- 《生物药研发策略解析》课件.ppt VIP
- 2023年在巡察动员会上的主持词 .pdf VIP
- GB_T 25849-2024移动式升降工作平台设计、计算、安全要求和试验方法.docx VIP
- 国开城市管理学1-11章节自测.pdf VIP
- 公路软土地基路堤设计规范(DB33-T 904-2021).docx
- 如何做好患者的跌倒评估和预防?.pptx
文档评论(0)