在LabVIEW中自定义控件.pdf
在labview中自定义控件的详细教程:如何是你的labview测试程序,前面板看起来更美观,让用户对使用的流程更清晰,这里教你如何在labview中自定义控件泛华测痉PANSINO控件45控件章布尔确定3,在我们己有的图片库中复制我们想用来作为按钮图片的图片本文中将以这个按钮为图片进行训述。复制好图片至剪贴板中后。在控件编辑窗口中,控件上右键选择从剪贴板导入图片>终P控件45自定义类型白回文牛住编餐E查着项目②操作◎T目目定义类型ipe T布尔确定显示项转换为显示挥件说明和提示替换数据操作高级机械动作释放文本多文本字符串从剪贴板导人图片N假属性真4,此时控件效果如卜图:地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn泛华测痉PANSINOE控件45自定义类型章文件(辆辑E查看y项目操作Q)工具〔州自定义类型、‖13rm布尔确定5,可以更改为自定义模式下,对图片的位置进行修正控件45自定义类型章口回区文件〔編辑查看项目巴操作(Ω)二具团自定义类型·1tahm布尔确定6,同样也可以对文本的位置以及搾件的底板的人小进行修正,修正之后的控件如下图所示地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn泛华测控PANSINO控件45自定义类型巴区P粒件45自定义类型艾件错G查看项目②操作工具文件(编辑查看(项目心操作()工具①[自定义类型[[自定义类型13pt Tahoma相尔布尔确足布尔值为真布尔值为假同样也可以对文本的位置以及控件的底板的大小进行修正,修正之后的控件如下图所示这样制定出来的控件的特点是:1,即使点在图片上,也能更改布尔按钮的状态。2,真假布尔值状态下,该图片不能进行变换。方法二1,打开 LabVIew,创建新式型的布尔按钮,石键选择高级>自定义。为什么要创建新式的控件呢?在本方法的末端会提供P控件45自定义类塞回回区文件G)编锅查看(项目巴作⑨工具红2自定义类型、[13计10确定按钮确定2,打开如上图所示窗∏后,去我们图片斥中,复制图片◎至剪贴板。回到控件的編辑窗∏,控件上右键选择从剪贴板导入图片>>假。地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn泛华测痉PANSINOE控件45自定叟类包叵区件辑查看y项目操作Q工具自定义类型pt Tahoma确定按钮显示项转换为显示控件说明和提示替换数据操作高级机械动作释放文本多文本宇符串从鸥贴板导入图片卜[假属性始终3,将出现如卜图所示效果:P控件45自定义类型喜白回区文件(綱辑但查看φ项目@)嬝作(工具T自义类型·10T确定按钮确定4,同样,在图片库中复制图片至剪贴板中。在控件上右键选择从剪贴板导入图片>真。地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn泛华测痉PANSINO1控件45自定义天型回区文件臼编辑查看y项目P操作(工具红自定义类型13pE T确定按钮显示项转换为显示控件说明和提示替换潋据操作高级机械动作释放文本多文本字符串从翦贴梗导入图片假属性真忙终5,不显小控件的文本。做出来的控件的状态将如下。口控件45自定义类型t巴回应控件15白定义类型包回凶文件编辑查看(项目)操作工具工神(编辑〔查看项目(操作①工目(①[自定火类型·13t[自定义类型13pt Taho门确定按钮确定按钮布尔值为真布尔值为假这种方法做出来的控件的特点是:1,背景透明,但是实际控件大小为所选择的图片的大小。一般是一个规则的下方形或者长方形前文提到为什么要用新式按钮呢?先来说一下按钮的图片项,每个布尔按钮在自定义模式下,是有若干图片项的,而新式按钮与系统型的按钮的图片项是不同的。图片项的查看方式为:将控件窗∏置为自定义状态下,在控件上石键选择图片项即可看到该控件所拥有的图片项地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn泛华测痉PANSINO控件45自定义类回区文件()锎辑)查看{y项目巴操作()工具T小自定义共型1计m布尔复制至前贴板从剪贴板导入图片以相同大小剪贴板导入从文件导以相同大小具文件导入还原原始大小图片项圖888□口下边左图所示是新式按钮的图片项。如果在最开始创建控件时,选择的是系统行按钮,并且同样按照本方法导入不同的图片,最后图片项将显小为为右图所小。其中1,2,3,4与新式的控件的图片项的意义相同,分别为真,假,真到假点击吋,假到貞点击吋。5,6是系统按钮才有的特性。5为当程序运行状态下按钮为假时鼠标移入时的状态,6为当程序运行状态下按钮为真时鼠标移入时的状态56上述制作的方法,如果控件使用系统型,我们可以想象,在程序运行卜,当鼠标移入时,按钮将变得很奇怪,就是因为它的5,6图片项没冇定义。解决方法是直接用新式控件即可。当然如果不怕麻烦可以选中图片项5和6,并导入对应的图片。但是做出来的效果与使用新式控件进行编辑的效果相同。方法三上述方法,要么按钮为真假时不能为同一副图片,要么没有系统的背景框。那么如果希望能做到我之前发送的按钮集中的这种按钮,又该怎么做呢?st artstart这种按钮,并不是我们使用传统的确定按钮进行自定义编辑时就能实现的。需要多个控件进行配合编辑才行。布尔确定按钮确确定地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn泛华测控PANSINO1,首先,创建一个如下图所示按钮。进入自定义模式状态下。布尔2,另外再选择一个系统型的按钮,进入该系统按钮的自定义模式状态下。布尔确定注:如果无法对两个控件同时选中高级≯自定义,先将要编辑的两个控件都另存为自定义类型的控件,再次打开即可。以下均在自定义模式下完成。E控件47.ct1自定义类率回区控件6.ct1口件G编辑G查看项目(操作)工具①窗口y)帮件()編辑(E)查看②项目卫操作(Q工具江窗口)轉团自定义类至-[团自定类型和尔3,在系统型控件上右键选择复制至剪贴板E控件47.ct1自定义类型回冈整件6:1自定义类型文件G编辐侣查看项目操作(二具I霰匚,文件G铜锔E查看(0三①映作工具①宙口(帮助「自定义类刑13tTa布尔复至郭板相司大小贴饭是入相司大小文芒导不原原始大小4,在新式的带LED的布尔按钮上右键选择图片项地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn泛华测控PANSINO控件47.ct1自定叉类塞冈控件46.ctl自定义类型文吽)病辑)查看{顶目巴操作⑨)工具(T匚ci件G编E查看(y项目巴操作(工具二窗口(帮助布尔烹物至邮贴板从剪贴板导入网片以相同大小从剪板号从文件导以相同大小从文件导原始大小5,选择我们需要编辑的图片项,因为之前复制的是系统型控件的假状态的图片,那么在选择新式按钮的图片项时,也应该选择对应的图片项。选择完毕后,选择“以相同大小从剪贴板导入”。控件47.ct1自定义夹型回Xp控件46,tl自定义型仁i)编承E查看△项目P)操作⑨)工具窗口)帮耵文件編辑查着③项目(P操作(工具⑦T窗口(业帮助尔有尔剪贴板子入图片以相同大小从贴椒导人以相问小从义件导图片项6,导入后的结果为控件47.ct1自定叉类想口日风粒件41叶t1自定义关类件)查看心顶目的嫵工貝山唐η弗项日(操工且口自定义类现布尔布尔7,同坦,将系统型按钮置为假吋,将其图片项复制至剪贴板,并导入到新式按钮的对应图片项下导入完成之后如下图所示。地址:北京市海淀区中关村东路18号财智国际大夏A座9层电话:(010)82600055传真:(010)62628056http://www.pansinocomcn
- 2020-12-08下载
- 积分:1
内存乒乓缓存机制和消息分发机制的C代码实现
用C代码实现乒乓内存缓冲机制,具体实用价值,帮助您提高内存响应速度与及时数据的处理。unsigned long writeunsigned long greadunsigned long overflowST TWTMSG QUEUE:/ Helper macros for accessing Msg queues. *#define tWt QUEUE EMPty(a)(((g->write==(q)->gread)? 1: 0)#define twt_ QUeUe full(a)(((((q)->qwrite +1% TIMEWEIGHT TASKQUEUE SIZED)==(q)->gread)?1: 0)米 generate a Msg entity*正常返回消息体的指针,异常返回NULLT TWTMSG* generateMsg(tT-TWTMSG* pmSg=nULL,if(NULL =-(ptMsg malloc(sizeof(T TWTMSG)))return NULL;memset(ptMsg, 0, sizeof(T TWTMSG)return pmSg;destroy a Msgvoid destroy Msg(t TWTMSG ptMsgif(NULL ptMsg->pfDestroyMsg)pt Msg->pfDestroy Msg(ptMsg->pvMsg)if (NULL != pt Msg)free(pmSgfree a Msg Queuevoid freeTWTMsg Que(T TWTMSG QUEUE* ptMsgQif(NULL =ptMsg Afree(ptMsg Q);Init a Msg QT TWTMSG QUEUE* initTWTMsg QueoT TWTMSG QUEUE pmSg Q= NULlif (NULL ==(ptMsgQ malloc(sizeof(T_ TWTMSG QUeue)goto ErrRetmemset(ptMsgQ, 0, sizeof(T TWTMSG QUEUE))return pmSg Q;Errretprintf( initTWTMsg Que Fail! ")freeTWTMsgQue(ptMsg Q)return nullPop a pvMsg packet from a msg packet queues param g is the packet queue from which to pop the pbuf@return pointer to pvMsg packet if available, NULl otherwiseT TWTMSG* TWTMsg Get(T_ TWTMSG QUEUE aT TWTMSG*//*加锁if(TWT_ QUEUE_ EMPTY(a))iReturn a NUll pointer if the queue is emptypmSg=NULL;else is The queue is not empty so return the next frame from itand adjust the read pointer accordinglypmSg=g->pvMsglq >greadg->gread =((q->gread +1)% TIMEWEIGHT_TASKQUEUE_ SIZE)/*解锁return(pmSg);Push a pmSg packet onto a pvMsg packet queue@param p is the pmsg to push onto the packet queue@param g is the packet queue.W @return 0 if successful, -1 if q is fullnt TWTMsg Send(T tWTMSg*p, T TWTMSG QUEUE *qint ret/if(!TWT_ QUEUE FULL(al)iThe queue isn t full so we add the new frame at the currentw write position and move the write pointer.g->pvMsgla->write]=pg- >write =((q->qwrite+1)% TIMEWEIGHT TASKQUEUE SIZE;ret =oThe stack is full so we are throwing away this value. Keep trackof the number of times this happensg->overflow++ret =-1://*解锁return(ret)**米**米来米***来米*半米*米*半米*米求***半*米米求半**米求半**半求半和*米*//消息分发机制//*算法是//*正常返回0,出错返回-1水米米******水*米*水**米*半*水米米冰半**水水*水米米半米冰水*米水水*水*米水水extern int RecToFile MsgProc(T_ MSG_ REC2 FILE* ptMsg);int DispatchMsg(T TWTMSG *ptMsgitif(NULl = ptMsg goto ErrRet/*dispatch msg*/switch(ptMsg->en Msg Type)case TWT PINgPoNgBuff recRecTo File Msg Procl(TMSG_REC2FE) (pmSg->pMsg);/*处理消息*/destroy Msg( pmSg;/*消毁消息breakdefault.printf("Dispatch Msg Msgtype Error! n")break.return 0ErrRetprintf("Dispatch Msg Fail! ";return-1./*buff size*/#defineP| NGPONG_ BUFF BSIZE0X20000//10*1024*1024/*10M*/*ping pong buff*///chargacPINGBUFF[PINGPONG BUFF BSIZE]; /* Ping Buff*///chargacPONGBUFF[PINGPONG_ BUFF BSIZE] *Pong Buff*/水米米*********米*水**米*半*水米米水**冰水*水米米半半水半米冰水*米水水*水*米米//*释放 ping pong buff/必然成功//*无返回木***木*水****本**水*水水*水****本水**水水****水水***本***米*水void Destroy Ping Pong Butt(T PINGPONGBUFF USE DES ptPing Pong Butt)nLoopif (NULL = pt Ping pong buffreturnfor (nLoop=0; nLooptIng BuffUse[nLoop]. pcHeadAddr)free(ptPing Pong ->t Ping BuffUse[nLoop]. pcHeadAddr)free(pt Ping pong Buff)/初始化 ping pong buff返回 pign pong buff的描述指针//*正常返回0,出错返回-1水水水水水水水水水木水木水水水水水木水木水水水水水水水水本水水水水水水水水水本水水水水水水水水水水水水水T PINGPONGBUFF USE DES InitPing Pong Buff(unsigned int n BuffSizeT PINGPONGBUFF USE DES* ptBuffDes=NULLintnLoop/*获取buf描述*if NULL==(ptBuffDes=malloc(sizeof(T PINGPONGBUFF USE DES))))goto ErrRetmemset(pt BuffDes, 0, sizeof(T_PINGPONGBUFF USE_ DES));/*分别初始化ping和pong*/for(nLoop=0; nLooptIng BuffUsenLoop pcHeadAddr =malloc n BuffSize))goto Err Ret;ptBuffDes->tIng BuffUselnLoop] nBuffSize nBuffsizeptBuffDes->tPing BuffUse[nLoop]. oFfsetptBuffDes->tPing BuffUsenLoop) eUseStatus-=BUFF WRITEABLE;pt BuffDes->eCurUseIDBUFF PINGreturn pt BuffDesErrretprintf("lnitPing Pong Buff Fail!");DestroyIng Pong Buff(pt BuffDes)turn null平**米**米*米***来米米*米*米*半米*米米米来*半米平**米米求*来*半求半来*米求*和*米*/*Reset ping pong buff//*正常返回0,出错返回-1米米米米水冰米*米米水**米米冰*米水米米米米水米水*水米米来米米x米来米米水冰来来宋来水米来米来冰#define ResetBuffUse(ptBuffuse)pt BuffUse->oFfset0pt BuffUse->eUseStatus BUFF WRITEABLEgenerate a file rec msg*正常返回消息体的指针,异常返回NULLT_MSG_REC2lGK SenFRMSB(T_BUFF_USE_DES *ptBuffUse, REC_FILE_DESLIST *ptFileListRT MSG REC2FILE KE* ptRFMsg= NULL;if(NULL ==(ptRFMsg malloc(sizeof(T_ MSG REC2 FILE)return nUllptRFMsg- >pt BuffUse pt BuffUseptRFMsg->pt Filelist ptFilelist;return ptRFMsg
- 2020-12-03下载
- 积分:1