labwindowscvi8教程-多线程程序设计解析.pptVIP

labwindowscvi8教程-多线程程序设计解析.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LabWindows/CVI教程(8) 多线程程序设计 主讲:乔立岩 Email: qiaoliyan@ (交作业) MSN: qiaoliyan@(在线交流) Tel:ext. 8611 (逸夫楼611) 1. 线程和进程 进程常被定义为应用程序的运行实例。 线程是指进程内部的可独立执行的单元,是操作系统对系统资源的基本调度单位。 每个进程至少拥有一个线程,这个线程被称为主线程(main thread) 。 一个进程也可以拥有多个线程,同属于一个进程的所有线程都共享进程的虚拟地址空间,线程之间可以共享进程的全局数据和资源。 2. 多线程程序(Multi-Threading ) 多线程程序就是在同一个时间段内至少有两个线程在执行程序代码的程序。 在多线程程序中,程序自己让操作系统创建主线程之外的其它线程,这些线程被称作次线程。(secondary thread) 次线程和主线程的主要差别就在于线程在何处开始执行。主线程一般开始执行程序的main或WinMain函数;程序开发者确定每一个次线程开始执行的函数。 操作系统允许一个特定线程执行的时段被称作一个时间片(time-slice)。 操作系统暂停一个线程的执行,转而允许另一个线程执行它的时间片的行为被称作线程切换(thread-switch)。 3. 多线程的优点 改善吞吐量,避免阻塞 提高响应速度和更有效的后台处理 减少运行过程和用户界面的相互影响 最大程度利用多处理器的性能 4. 两种多线程机制 异步定时器 适用于在固定时间间隔内执行的任务 调用toolslib.fp函数NewAsyncTimer,把想要在次线程中执行的函数名称传递给它,并且设定每次函数执行的时间间隔 int NewAsyncTimer (double Interval, int Count, int Initial_State, void *Event_Function, void *Callback_Data); int CVICALLBACK FunctionName (int reserved, int timerId, int event,void *callbackData, int eventData1, int eventData2); toolslib库使用一个多媒体定时器线程执行注册在一个程序里的所有异步定时器回调,因此,如果想要在程序里并行执行多个函数, 建议使用线程池函数 4. 两种多线程机制(2) 线程池 (thread pools) 适用于需要不连续地执行多次或在循环中执行的任务 调用实用库(Utility Library)中的CmtScheduleThreadPoolFunction函数,把想要在次线程中执行的函数名传递给它,线程池调度这个函数在它的其中一个线程中运行。 int CmtScheduleThreadPoolFunction (int poolHandle, ThreadFunctionPtr threadFunction, void *threadFunctionData, int *threadFunctionID); int CVICALLBACK ThreadFunction (void *functionData); int CVICALLBACK DataAcqThreadFunction (void *functionData); int main(int argc, char *argv[]) { int panelHandle; int functionId; if (InitCVIRTE (0, argv, 0) == 0) return -1; /*内存溢出 */ if ((panelHandle = LoadPanel(0, DAQDisplay.uir, PANEL)) 0) return -1; DisplayPanel (panelHandle); CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, DataAcqThreadFunction, NULL, functionId); RunUserInterface (); DiscardPanel (panelHandle); CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, functionId, 0); return 0; } int CVICALLBACK DataAcqThreadFunction (void *

文档评论(0)

yaocen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档