大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 多线程技术在VC++串口通信程序中的应用

多线程技术在VC++串口通信程序中的应用

时间: 2021-07-31 作者:daque

1 概括  在新颖的百般及时监察和控制体例和通讯体例中,在windows 9x/nt下运用vc++对rs-232串口编制程序是常用的本领。windows 9x/nt是超过式的多工作操纵体例,步调对cpu的占用功夫由体例确定。多工作指的是体例不妨同声运转多个过程,每个过程又不妨同声实行多个线程。过程是运用步调的运转范例,具有本人的地方空间。每个过程具有一个干线程, 同声还不妨创造其余的线程。线程是操纵体例调配cpu功夫的基础实业,每个线程占用的cpu功夫由体例调配,体例不停的在线程之间切换。过程中的线程共享过程的假造地方空间,不妨考察过程的资源,居于并行执奇迹态,这即是多线程的基础观念。   2 vc++对多线程的扶助  运用mfc开拓是较一致的vc++编制程序本领。在vc++6.0下,mfc运用步调的线程由cwinthread东西表白。vc++把线程分为两种:用户界面线程和工作家线程。用户界面线程不妨供给界面和用户交互,常常用来处置用户输出并相映百般事变和动静;而工作家线程重要用来处置步调的后盾工作。  步调普遍不须要径直创造cwinthread东西,经过挪用afxbeginthread()因变量就会机动创造一个cwinthread东西,进而发端一个过程。创造上述的两种线程都运用这个因变量。  线程的中断在于于下列事变之一:线程因变量归来;线程挪用exitthread()退出;特殊情景下用线程的句柄挪用terminatethread()退出;线程分属的过程被中断。 3 多线程在串口通讯中的运用  3.1 串口通讯对线程同步的诉求  由于同一过程的一切线程共享过程的假造地方空间,而在windows 9x/nt体例底线程是汇编级阻碍,以是有大概多个线程同声考察同一个东西。那些东西大概是全部变量,mfc的东西,mfc的api等。串口通讯的几个特性确定了必需沿用办法来同步线程的实行。  串口通讯中,对于每个串口东西,惟有一个缓冲区,发送和接受都要用到,必需创造起同步体制,使得在一个功夫只能举行一种操纵,要不通讯就会堕落。  举行串口通讯处置的各别线程之间须要融合运转。即使一个线程必需等候另一个线程中断本领运转,则该当挂起该线程以缩小对cpu资源的占用,经过另一过程实行后发出的旗号(线程间通讯)来激活。  vc++供给了同步东西来融合多线程的并行,常用的有以次几种:   csemaphore:旗号灯东西,承诺确定数手段线程考察某个共享资源,常用来遏制考察共享资源的线程数目。   cmutex:互斥量东西,一个功夫最多只承诺一个线程考察某资源,未被占用时居于有旗号状况,不妨实行对共享资源的互斥考察。   cevent:事变东西,用来使一个线程报告其余线程某一事变的爆发,以是也不妨用来封闭对某一资源的考察,直到线程开释资源使其变成有旗号状况。实用于某一线程等候某事变爆发本领实行的场所。   ccriticalsection:临界区东西,将一段代码置入临界区,只承诺最多一个线程加入实行这段代码。一个临界区仅在创造它的过程中灵验。  3.2 等候因变量  win32 api供给了能使线程阻碍其自己实行的等候因变量,等候其监督的东西爆发确定的旗号才遏止阻碍,连接线程的实行。其意旨是经过姑且挂起线程缩小对cpu资源的占用。在某些巨型监察和控制体例中,串口通讯不过个中工作处置的一局部,以是必需商量步调实行功效题目,当串口初始化结束后,就使其居于等候通讯事变的状况,缩小耗费的cpu功夫,普及步调运转功效。  常用的等候因变量是waitforsingleobject()和waitformultipleobjects(),前者可监测单个同步东西,后者可同声监测多个同步东西。  3.3 串口通讯的臃肿i/o办法  mfc对于串口动作文献摆设处置,用createfile()翻开串口,赢得一个串口句柄。翻开后setcommstate()举行端口摆设,囊括缓冲区树立,超时树立和数据方法等。胜利后就不妨挪用因变量readfile()和writefile()举行数据的读写,用waitcommevent()监督通讯事变。closehandle()用来封闭串口。  在readfile()和writefile()读写串口时,不妨采用同步实行办法,也不妨采用臃肿i/o办法。同步实行时,因变量直到实行结束才归来,所以同步实行的其余线程会被阻碍,功效低沉;而在臃肿办法下,挪用的读写因变量会登时归来,i/o操纵在后盾举行,如许线程就不妨处置其余工作。如许,线程不妨在同一串口句柄上实行读写操纵,实行"臃肿"。  运用臃肿i/o办法时,线程要创造overlapped构造供读写因变量运用,该构造最要害的分子是hevent事变句柄。它将动作线程的同步东西运用,读写因变量实行时hevent居于有旗号状况,表白可举行读写操纵;读写因变量未实行时,hevent被置为无旗号。4 步调要害代码的实行  步调特意创造了一个串口通讯类,底下给出要害分子因变量的中心代码。bool initcomm file://串口初始化,这边只给出要害办法的代码,下同{ handle m_hcomm; commtimeouts m_commtimeouts; m_hcomm = createfile("com1", file://在这边只运用串口1  generic_read | generic_write, file://翻开典型为可读写  0, file://以独吞形式翻开串口  null, file://不树立安定属性  open_existing,  file_flag_overlapped, file://臃肿i/o办法  0); if (m_hcomm == invalid_handle_value) file://翻开不可功  {return false;} m_commtimeouts.readintervaltimeout = 1000;  file://举行超时树立,读者群应按照本人的本质须要树立 m_commtimeouts.readtotaltimeoutmultiplier = 500; m_commtimeouts.readtotaltimeoutconstant = 5000; m_commtimeouts.writetotaltimeoutmultiplier = 500; m_commtimeouts.writetotaltimeoutconstant = 5000; if (!setcommtimeouts(m_hcomm, &m_commtimeouts))  {closehandle(m_hcomm);   return false;} purgecomm(m_hcomm, purge_rxclear | purge_txclear | purge_rxabort | purge_txabort); file://清缓冲 return true;} 之上是特意对准com1的初始化,即使要运用同一因变量对各别串口初始化,则要在初始化前进步入代码临界区,以保护在某一功夫只举行一个串口的初始化。  在串口初始化胜利后,就不妨创造监察和控制线程处置串口通讯事变。底下是该线程的要害代码。uint commthread(lpvoid pparam) file://用来监察和控制串口的工作家线程{ bool bresult = false; if (m_hcomm) file://察看端口能否翻开,这边m_hcomm同上,作家在这边做了简化  purgecomm(m_hcomm, purge_rxclear | purge_txclear | purge_rxabort |    purge_txabort);  for (;;) file://只有线程运转,就居于监督端口动作的无穷轮回  {   bresult = waitcommevent(m_hcomm, &event, &m_ov);    file://m_ov是overlapped典型的分子变量   if (!bresult)    { file://举行堕落处置}   else   {    event = waitformultipleobjects(4, m_hevent, false, infinite);    file://无穷等候设定的事变爆发,数组m_hevent按照须要设置了须相应的接受,发送,封闭端口事变和overlapped典型的hevent事变    switch (event)    { file://读写事变的相应处置进程,在此略}    }    return 0; } 如许监察和控制主步调就不妨运用afxbeginthread()因变量来爆发commthread串口监察和控制线程。即使要实行对一切端口的同声监察和控制,不妨辨别对端口创造监察和控制线程。  5 总结  动作一个机房监察和控制体例的构成局部,本串口通讯步调在vc++6.0下编写翻译经过,在运用windows 98/nt的局域网里运转杰出。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.