﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-每一个你不满意的现在, 都有一个你没有努力的曾经.-随笔分类-【技术干货】</title><link>http://www.cppblog.com/Wurq/category/21291.html</link><description>G-bits Wurq</description><language>zh-cn</language><lastBuildDate>Fri, 18 Aug 2017 18:58:58 GMT</lastBuildDate><pubDate>Fri, 18 Aug 2017 18:58:58 GMT</pubDate><ttl>60</ttl><item><title>【技术干货】在C#的涉及UI的开发中，跨线程直接访问控件的解决方案</title><link>http://www.cppblog.com/Wurq/archive/2017/08/16/215163.html</link><dc:creator>Wurq</dc:creator><author>Wurq</author><pubDate>Wed, 16 Aug 2017 14:50:00 GMT</pubDate><guid>http://www.cppblog.com/Wurq/archive/2017/08/16/215163.html</guid><wfw:comment>http://www.cppblog.com/Wurq/comments/215163.html</wfw:comment><comments>http://www.cppblog.com/Wurq/archive/2017/08/16/215163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wurq/comments/commentRss/215163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wurq/services/trackbacks/215163.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 14pt;"><em>解决方案：</em></strong><strong><em><br />&nbsp;&nbsp; </em>通过委托的方式，实现将当前线程的将要执行的命令，插入到访问控件的线程中.<br />&nbsp;&nbsp; 经典的解释: <br />&nbsp;&nbsp; &nbsp;&nbsp;</strong> 你想要买东西，然而你没有足够的零花钱(没有足够的权限)，你需要通过你老爸帮你买东西(执行功能代码)。<br />&nbsp;&nbsp; &nbsp;&nbsp; 你不能直接拿你老爸的钱包去买东西(跨线程)，因为这样子是不合适的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但你可以告诉你老爸你喜欢这玩具(委托)，让你老爸拿自己的钱包去买东西(让控件的所在线程执行功能代码)。<strong><br /></strong><u><strong><em><br /></em></strong></u><div><strong><em>实现过程:</em></strong></div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">a.创建委托函数delegate&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;MyDele(<img src="http://www.cppblog.com/Images/dot.gif" alt="" />);<br />b.将要执行的功能代码封装成独立函数或Lambda表达式或者匿名方法，添加到委托事件中。<br />&nbsp;&nbsp;&nbsp;&nbsp;独立函数:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDele&nbsp;my&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MyDele(独立函数名);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Lambda表达式:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDele&nbsp;my&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(传参)</span><span style="color: #000000; ">=&gt;</span><span style="color: #000000; ">{要执行的功能代码;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;匿名方法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDele&nbsp;my&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">delegate</span><span style="color: #000000; ">(传参){要执行的功能代码;};<br /><br />c.将委托插入到访问控件的线程中。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.BeginInvoke(委托事件名,传参);</span></div><u><strong><br />WinForm的UI开发:</strong></u><br />&nbsp;&nbsp; 可以通过control.InvokeRequired判断该控件是属于本线程，如果不属于本线程，则返回ture。<br />&nbsp;&nbsp; 通过在函数头对control.InvokeRequired的判断，能够将所在函数作为独立函数调用。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;TestFunction(<img src="http://www.cppblog.com/Images/dot.gif" alt="" />)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(control.InvokeRequired)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDele&nbsp;my&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MyDele(TestFunction);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.BeginInvoke(my,<img src="http://www.cppblog.com/Images/dot.gif" alt="" />);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;要执行的功能代码;&nbsp;&nbsp;&nbsp;&nbsp;<br />}</span></div>&nbsp;&nbsp; 在跨线程调用控件时，会创建委托事件，将该函数添加到委托事件中，插入到访问控件的线程中，并且退出该函数。<br />&nbsp;&nbsp; 当所访问控件的线程执行到该委托事件时，由于该控件是在本线程执行。因此，不会创建委托事件，从而执行功能代码。<br /><br /><u><strong>MFC的UI开发:</strong></u><br />&nbsp;&nbsp; MFC的Invoke相关的API是存在control.Dispatcher中，但不存在InvokeRequired这API。<br />&nbsp;&nbsp; 由于不存在InvokeRequired这API，因此无法判断是否跨线程调用控件。<br />&nbsp;&nbsp; 不能够将所在的函数作为独立函数调用(如上述的实现方式)。<br />&nbsp;&nbsp; 只能通过常规的实现方式实现：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;TestFunction(<img src="http://www.cppblog.com/Images/dot.gif" alt="" />)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a.独立函数:&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;MyDele&nbsp;my&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MyDele(独立函数名);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b.Lambda表达式:</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;MyDele&nbsp;my&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(传参)</span><span style="color: #000000; ">=&gt;</span><span style="color: #000000; ">{要执行的功能代码;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">c.匿名方法:</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;MyDele&nbsp;my&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">delegate</span><span style="color: #000000; ">(传参){要执行的功能代码;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.Dispatcher.BeginInvoke(my,传参);<br />}</span></div>&nbsp;&nbsp; 通过将要执行的功能代码/函数,添加到委托事件中，再将该委托事件插入到控件所在的线程，让控件所在的线程执行该功能代码/函数。<br /><br />转载请备注:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "></span><span style="color: #000000;">**************************************</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;作者: Wurq&nbsp;<br /></span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;博客:&nbsp;http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.cppblog.com/wurq/&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;日期:&nbsp;</span><span style="color: #000000; ">2017</span><span style="color: #000000; ">/</span><span style="color: #000000; ">8</span><span style="color: #000000; ">/</span><span style="color: #000000; ">16</span><span style="color: #000000; ">&nbsp;<br /></span><span style="color: #000000; ">**************************************</span></div></div><img src ="http://www.cppblog.com/Wurq/aggbug/215163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wurq/" target="_blank">Wurq</a> 2017-08-16 22:50 <a href="http://www.cppblog.com/Wurq/archive/2017/08/16/215163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【宏定义】静/动态 创建变量</title><link>http://www.cppblog.com/Wurq/archive/2017/04/08/214818.html</link><dc:creator>Wurq</dc:creator><author>Wurq</author><pubDate>Sat, 08 Apr 2017 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/Wurq/archive/2017/04/08/214818.html</guid><wfw:comment>http://www.cppblog.com/Wurq/comments/214818.html</wfw:comment><comments>http://www.cppblog.com/Wurq/archive/2017/04/08/214818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wurq/comments/commentRss/214818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wurq/services/trackbacks/214818.html</trackback:ping><description><![CDATA[<div><u style="font-size: 12pt;"><strong>1、利用宏定义 静态创建变量 </strong></u><br style="font-size: 12pt;" /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;VAR(id)&nbsp;var_##id</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;_TO_STR(var_name)&nbsp;#var_name</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;TO_STR(var_name)&nbsp;_TO_STR(var_name)</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;_DEF(def,var,val)&nbsp;def&nbsp;var&nbsp;=&nbsp;val</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;DEF(def,var,val)&nbsp;_DEF(def,VAR(var),val)</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;#define&nbsp;AUTO_(def,var,val)&nbsp;def&nbsp;VAR(var)&nbsp;=&nbsp;val&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">影响可读性<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;DEF(def,id,val)&nbsp;=&gt;&nbsp;def&nbsp;var_id&nbsp;=&nbsp;val</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">DEF(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,&nbsp;Gbits,&nbsp;</span><span style="color: #000000; ">511768840</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">(%s&nbsp;=&nbsp;%d)\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;TO_STR(VAR(Gbits)),VAR(Gbits));</span></div><br /><div><u style="font-size: 12pt;"><strong>2、能否利用宏定义 动态创建变量 </strong></u></div><div>能否动态创建变量 var_1,var_2, ...,var_n？答案似乎是否定的。<br />因为宏是在编译期间解析的，因此,宏定义无法在运行期间完成该任务<br />例子如下:&nbsp;&nbsp;&nbsp; <br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;DEF(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,&nbsp;i,&nbsp;i);<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">(%s&nbsp;=&nbsp;%d)\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;TO_STR(VAR(i)),&nbsp;VAR(i));<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000;">}</span></div>因为宏定义在编译期间解析，因此所定义的变量编程var_i,而非var_1,var_2,...var_n.<br /><br /> </div></div><img src ="http://www.cppblog.com/Wurq/aggbug/214818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wurq/" target="_blank">Wurq</a> 2017-04-08 15:16 <a href="http://www.cppblog.com/Wurq/archive/2017/04/08/214818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>