<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>谷夕的编程空间 </title><link>http://www.mscenter.edu.cn/blog/gxisone/</link><description /><managingEditor>谷夕</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>谷夕</dc:creator><title>校园网+ADSL 双线策略路由</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/12/20/268987.html</link><pubDate>Thu, 20 Dec 2007 09:58:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/12/20/268987.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/268987.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/12/20/268987.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/268987.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/268987.html</trackback:ping><description>现在我们有3个宿舍总共9台电脑，两个路由器，一个连ADSL，一个连校园网 &lt;BR&gt;&lt;BR&gt;ADSL路由器的IP为 192.168.1.1 &lt;BR&gt;校园网的为 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;192.168.1.200 &lt;BR&gt;&lt;BR&gt;现在要解决的问题是，除了192.168.1.107和192.168.1.149这两台电脑只能从校园网端口出去，其他的电脑，既能从ADSL出，也能从校园网出。 &lt;BR&gt;&lt;BR&gt;另外，ADSL的带宽只有1M，而隔壁宿舍有人BT，我们宿舍也有人BT，有人经常玩网game。他们一bt或者看大量图片的小说的时候，我如果用adsl连接去佛山的KOF服务器玩拳王就非常卡，根本无办法玩。所以ADSL这条线路要进行QOS &lt;BR&gt;&lt;BR&gt;DD-WRT这个固件对于策略路由来说，能够正常使用，但对于QOS来说，不够Tomato固件好。 &lt;BR&gt;&lt;BR&gt;后来把路由刷了Tomato，发现ip route和ip rule不能用。研究了几天，原来是Tomato作者编译时没有把Advance Router编译进内核，也就是说不能进行策略路由，于是自己重新配置一下内核再编译Tomato的源代码让Tomato支持策略路由。 &lt;BR&gt;&lt;BR&gt;完成后，在192.168.1.200这个路由上，利用 &lt;BR&gt;ip route add 0/0 via 10.10.114.129 table 10 &lt;BR&gt;ip rule add from 192.168.1.149 table 10 &lt;BR&gt;ip rule add from 192.168.1.107 table 10 &lt;BR&gt;以上语句就是创建一个默认走10.10.114.129这个网关的路由表 &lt;BR&gt;然后把192.168.1.149和107这两个IP的电脑的所有数据都走table 10，即由校园网出去 &lt;BR&gt;&lt;BR&gt;以下配置静态路由表，如果是教育网IP段的话，由10.10.114.129这个网关出去 &lt;BR&gt;route add -net 210.25.128.0 netmask 255.255.192.0 gw 10.10.114.129 &lt;BR&gt;route add -net 219.243.192.0 netmask 255.255.192.0 gw 10.10.114.129 &lt;BR&gt;...............（省略很多） &lt;BR&gt;&lt;BR&gt;以下设置默认网关（即如果从静态路由表匹配不到网关的话，默认从adsl出去） &lt;BR&gt;ip route change 0/0 via 192.168.1.1 &lt;BR&gt;&lt;BR&gt;配置一个8080的端口映射，把ADSL路由的8080端口映射到校园网路由的端口，让我的女朋友（龙洞，用ADSL）可以通过校园网的代理服务器访问教育网的万方和维普数据库 &lt;BR&gt;iptables -t nat -A PREROUTING -d 192.168.1.200 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 222.200.99.242:8080 &lt;BR&gt;&lt;BR&gt;另外还配置了一个sock5代理服务器，正在测试，以后可以定时（凌晨2-3点左右）开放 &lt;BR&gt;&lt;BR&gt;配置QOS的在路由的Web里面设置，让192.168.1.149和107这两个IP不限流量（因为都从校园网出口出去了）。然后配置ADSL的上传带宽为（490kbit，不要用512kbit，否则效果不是很好） &lt;BR&gt;&lt;BR&gt;配置好QOS后，就算有人用BT在下载，其他人浏览网页和我玩KOF都不会卡了，因为BT的优先级最低，路由器把带宽优先让给其他程序 &lt;BR&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/268987.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>802.1x客户端移植</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/10/01/183439.html</link><pubDate>Mon, 01 Oct 2007 13:35:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/10/01/183439.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/183439.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/10/01/183439.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/183439.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/183439.html</trackback:ping><description>&lt;P&gt;很早以前写过H3C的客户端,这样算是可以用一台电脑做主机利用Internet共享校园网。但室友说想上校园网总要把我的电脑开了就觉得麻烦（我也不想别人擅自开我的电脑，所以后来把客户端做成服务启动，在windows2003没密码登陆的情况下，也能够自动拨上校园网）&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;暑假期间，突然发现了有种无线路由器可以刷DD－WRT（嵌入式Linux），于是突发奇想，把客户端移植到这样的路由器上面，就不用电脑做主机了。于是上淘宝买逛了逛，发现有45元一块的路由板（没有外壳，无线功能坏了，但有线部分正常，不影响使用），于是买了两块（后来后悔没有多买几块，其他的朋友说也想用）。&lt;BR&gt;板子大概是这样的：&lt;/P&gt;
&lt;P&gt;&lt;IMG height=487 src="/blog/images/edu_cn/gxisone/无标题.jpg" width=650 border=0&gt;&lt;/P&gt;
&lt;P&gt;因为以前在windows下用winpcap写过客户端，估计移植到linux下也不麻烦，主要是linux下用到libpcap，函数都是一样的。另外就是不能用x86的gcc，需要用mipsel-linux-gcc&lt;/P&gt;
&lt;P&gt;首先是要把libpcap用mipsel-linux-gcc编译出来。现在比较流行的有两种固件，一种是dd-wrt,另外一种是tomato。经过实践证明，编译出来的客户端不能同时用在这两个平台上，dd-wrt要用4.1.0-uclibc-0.9.28来编译（dd-wrt上有这个toolchains下载），而tomato需要用tomato源码里带的hndtools-mipsel-uclibc来编译。&lt;/P&gt;
&lt;P&gt;下载libpcap源码（我的是libpcap-0.9.7.tar.tar），解压出来后，执行以下命令（根据你的路径修改，下面是编译到tomato上的）&lt;/P&gt;
&lt;P&gt;./configure CFLAGS= --includedir /opt/brcm/hndtools-mipsel-uclibc/include LDFLAGS= --libdir /opt/brcm/hndtools-mipsel-uclibc/lib CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc --host=mipsel-linux --prefix=/opt/brcm/hndtools-mipsel-uclibc/ --with-pcap=linux&lt;/P&gt;
&lt;P&gt;make后&lt;/P&gt;
&lt;P&gt;编译出libpcap.a，把libpcap.a复制到编译器的lib目录，然后把libpcap里的pcap.h，pcap-bpf.h,pcap-namedb.h复制到编译器的include目录，然后就可以编译客户端源代码了&lt;/P&gt;
&lt;P&gt;&lt;IMG height=880 src="/blog/images/mscenter_edu_cn/gxisone/Untitled.jpg" width=591 border=0&gt;&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/183439.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>防止框架页刷新后回到原始页面的问题</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/01/08/118349.html</link><pubDate>Sun, 07 Jan 2007 17:48:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/01/08/118349.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/118349.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/01/08/118349.html#Feedback</comments><slash:comments>123</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/118349.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/118349.html</trackback:ping><description>&lt;P&gt;假如我们有页面Default.aspx，里面有一个框架：&lt;BR&gt;&amp;lt;iframe id="main" frameborder="0" src="Welcome.aspx"&amp;gt;&amp;lt;/iframe&amp;gt;，当装载Default.aspx时，默认加载Welcome.aspx页面。&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;Default.aspx&lt;/FONT&gt;页面上面有很多链接，点击连接后,main.src=&amp;#8221;新链接的URL&amp;#8221;，也就是说，点击的链接会在框架里显示，&lt;FONT color=#ff0000&gt;Default.aspx&lt;/FONT&gt;不用刷新。&lt;BR&gt;&lt;BR&gt;考虑以下情况，当点击&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;后，框架里显示&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;的内容，这时我们点击浏览器的刷新按钮，此时浏览器reload的并不是&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;，而是把&lt;FONT color=#ff0000&gt;Default.aspx&lt;/FONT&gt;重新载入，此时框架页里显示的是&lt;FONT color=#ff0000&gt;Welcome.aspx&lt;/FONT&gt;。&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;丢失。&lt;BR&gt;&lt;BR&gt;下面，就这个问题我想出了一个办法，但并不完美。&lt;BR&gt;首先，我们可以通过ASP.NET的页面的&lt;FONT color=#009900&gt;Request.RawUrl&lt;/FONT&gt;取得原始的请求路径，例如&lt;FONT color=#ff0000&gt;News.aspx?id=1003&lt;/FONT&gt;。我们要把这个路径保存起来，然后动态改变&lt;FONT color=#ff0000&gt;Default.aspx&lt;/FONT&gt;里的&lt;FONT color=#0066ff&gt;src&lt;/FONT&gt;这个属性。&lt;BR&gt;&lt;BR&gt;在Global.aspx（VS2005默认没有这个文件，需要自己创建）的&lt;BR&gt;&lt;FONT color=#0066ff&gt;Application_BeginRequest(Object sender, EventArgs e)&lt;/FONT&gt;&lt;BR&gt;方法里添加一个Application变量，例如：&amp;nbsp; &lt;FONT color=#0066ff&gt;Application["url"] = Request.RawUrl&lt;BR&gt;&lt;/FONT&gt;当然，取得本次请求路径之前，需要保存上一次的请求路径，这样我们的代码变成了下面的样子&lt;BR&gt;&lt;FONT color=#0066ff&gt;Application["url1"] = Application["url"];&lt;BR&gt;Application["url"] = Request.RawUrl;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;然后再在Default.aspx里面的框架中使用这样的代码：&lt;BR&gt;&lt;FONT color=#3366ff&gt;&amp;nbsp;&amp;lt;iframe id="main" frameborder="0" src="&amp;lt;%=(Application["url1"]=="")?"Welcome.aspx":Application["url1"] %&amp;gt;"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;BR&gt;&lt;/FONT&gt;首先判断&lt;FONT color=#0066ff&gt;Application["url1"] &lt;/FONT&gt;是否为空，为空的话显示默认的页面，否则显示上次刷新的页面。&lt;BR&gt;这样有个问题是，如果请求&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;后，&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;里面有包含一些JS或者CSS文件的请求，这样会出现&lt;FONT color=#0066ff&gt;&amp;lt;iframe id="main" frameborder="0" src="XXX.CSS"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/FONT&gt;这样的情况，所以我们要在&lt;FONT color=#0066ff&gt;Application["url"] = Request.RawUrl;&lt;/FONT&gt;之前做一个判断，代码如下：&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0066ff&gt;&amp;nbsp;if (Request.RawUrl.Contains(".aspx")) Application["url"] = Request.RawUrl;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;如果请求的是aspx页面才更新Application的变量&lt;BR&gt;&lt;BR&gt;不完美的地方是，由于IE会有缓存，当我们点击&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;后，接着点击&lt;FONT color=#ff0000&gt;Index2.aspx&lt;/FONT&gt;，接着又点回&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;，这时虽然浏览器显示的是&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;，单浏览器并没有向服务器提出请求，显示的只是本地缓存，所以如果现在刷新&lt;FONT color=#ff0000&gt;Default.aspx&lt;/FONT&gt;的话，框架页里显示的是&lt;FONT color=#ff0000&gt;Index2.aspx&lt;/FONT&gt;，而不是&lt;FONT color=#ff0000&gt;Index.aspx&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;暂时想不出什么好办法，可能利用客户端的cookies可以解决问题...&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/118349.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>ASP.NET中引用dll“找不到指定模块"的完美解决办法</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/01/03/117877.html</link><pubDate>Tue, 02 Jan 2007 21:06:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/01/03/117877.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/117877.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2007/01/03/117877.html#Feedback</comments><slash:comments>219</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/117877.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/117877.html</trackback:ping><description>&lt;P&gt;最近继续用ASP.NET来重新开发ACM的Online Judge系统，因为要进行进程的监控，所以自己编写了一个非托管的DLL供ASP.NET调用。&lt;BR&gt;&lt;BR&gt;我用的是VS2005的开发环境，后来发现使用[DllImport("Judge.dll")]后提示 无法加载 DLL &amp;#8220;Judge.dll&amp;#8221;&amp;nbsp; 找不到指定的模块&lt;BR&gt;&lt;BR&gt;我这时是把Judge.dll拷贝到Bin目录下的，但仍然提示找不到DLL，在工程里添加DLL引用的时候，发现添加这个非托管DLL就会令VS2005异常退出（上网搜索后也发现有人有相同的问题）&lt;BR&gt;&lt;BR&gt;后来发现用[DllImport(@"C:\OJ\Bin\Judge.dll")]&lt;BR&gt;这样指定DLL的绝对路径就可以正常装载。&lt;BR&gt;&lt;BR&gt;这里还有一个解决办法&lt;A href="http://forums.asp.net/thread/1121085.aspx"&gt;http://forums.asp.net/thread/1121085.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;这个问题最常出现在使用第三方非托管DLL组件的时候,我的也同样是这时出的问题,Asp.Net Team的官方解决方案如下:&lt;BR&gt;&lt;BR&gt;首先需要确认你引用了哪些组件,那些是托管的,哪些是非托管的.托管的很好办,直接被使用的需要引用,间接使用的需要拷贝到bin目录下.非托管的处理会比较麻烦.实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后在那运行web,而CLR只会拷贝托管文件,这就是为什么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了.&lt;BR&gt;&lt;BR&gt;具体做法如下:&lt;BR&gt;首先我们在服务器上随便找个地方新建一个目录,假如为C:\DLL&lt;BR&gt;然后,在环境变量中,给Path变量添加这个目录&lt;BR&gt;最后,把所有的非托管文件都拷贝到C:\DLL中.&lt;BR&gt;&lt;BR&gt;或者更干脆的把DLL放到system32目录&lt;BR&gt;&lt;BR&gt;对于可以自己部署的应用程序，这样未偿不是一个解决办法，然而，如果我们用的是虚拟空间，我们是没办法把注册PATH变量或者把我们自己的DLL拷到system32目录的。同时我们也不一定知道我们的Dll的物理路径&lt;BR&gt;DllImport里面只能用字符串常量，而不能够用Server.MapPath(@"~/Bin/Judge.dll")来确定物理路径。&lt;BR&gt;&lt;BR&gt;经过一翻研究，终于想到了一个完美的解决办法&lt;BR&gt;首先我们用&lt;BR&gt;&amp;nbsp;[DllImport("kernel32.dll")]&lt;BR&gt;&amp;nbsp;private extern static IntPtr LoadLibrary(String path);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;[DllImport("kernel32.dll")]&lt;BR&gt;&amp;nbsp;private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;[DllImport("kernel32.dll")]&lt;BR&gt;&amp;nbsp;private extern static bool FreeLibrary(IntPtr lib);&lt;BR&gt;&lt;BR&gt;分别取得了LoadLibrary和GetProcAddress函数的地址，再通过这两个函数来取得我们的DLL里面的函数。&lt;BR&gt;我们可以先用Server.MapPath(@"~/Bin/Judge.dll")来取得我们的DLL的物理路径，然后再用LoadLibrary进行载入，最后用GetProcAddress取得要用的函数地址&lt;BR&gt;&lt;BR&gt;以下自定义类的代码完成LoadLibrary的装载和函数调用：&lt;BR&gt;public class DllInvoke&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("kernel32.dll")]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private extern static IntPtr LoadLibrary(String path);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("kernel32.dll")]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("kernel32.dll")]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private extern static bool FreeLibrary(IntPtr lib);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private IntPtr hLib;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DllInvoke(String DLLPath)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hLib = LoadLibrary(DLLPath);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~DllInvoke()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FreeLibrary(hLib);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //将要执行的函数转换为委托&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Delegate Invoke(String APIName,Type t)&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr api = GetProcAddress(hLib, APIName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (Delegate)Marshal.GetDelegateForFunctionPointer(api,t);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;下面代码进行调用&lt;BR&gt;&amp;nbsp;public delegate int Compile(String command, StringBuilder inf);//编译&lt;BR&gt;DllInvoke dll ＝ new DllInvoke(Server.MapPath(@"~/Bin/Judge.dll"));&lt;BR&gt;Compile&amp;nbsp;compile = (Compile)dll.Invoke("Compile", typeof(Compile));&lt;BR&gt;StringBuilder inf;&lt;BR&gt;compile(@&amp;#8220;gcc a.c -o a.exe&amp;#8220;,inf); //这里就是调用我的DLL里定义的Compile函数&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/117877.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>ACM 在线测评系统开发（Online judge）</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/11/14/92738.html</link><pubDate>Tue, 14 Nov 2006 15:55:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/11/14/92738.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/92738.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/11/14/92738.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/92738.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/92738.html</trackback:ping><description>最近在做一个ACM的OJ系统，平台是windows，用到的主要技术有 进程控制（控制进程的内存和CPU使用），管道（用来给程序进行输入输出重定向）&lt;BR&gt;管道技术不难实现，关于进程的控制，摸索了几天，说说我的心得：&lt;BR&gt;一开始我使用了CreateProcess()的DEBUG_ONLY_THIS_PROCESS，目的是通过while((WaitForDebugEvent(&amp;amp;de,p-&amp;gt;run_limite_time)!=0)&amp;nbsp;)来检测子进程的异常情况，&lt;BR&gt;通过switch(de.u.Exception.ExceptionRecord.ExceptionCode) ，可以捕获&lt;BR&gt;EXCEPTION_BREAKPOINT&lt;BR&gt;EXCEPTION_INT_DIVIDE_BY_ZERO&lt;BR&gt;EXCEPTION_INT_OVERFLOW&lt;BR&gt;EXCEPTION_ACCESS_VIOLATION&lt;BR&gt;....等等的异常（后来发现直接用GetExitCodeProcess（）函数就可以得到子进程的异常代码）&lt;BR&gt;在WaitForDebugEvent（）的循环里，一旦有异常发生，首先会抛出EXCEPTION_BREAKPOINT，然后需要进行一次ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,DBG_CONTINUE);调用，才能够得到正确的异常代码&lt;BR&gt;&lt;BR&gt;但用DEBUG_ONLY_THIS_PROCESS创建进程后，一旦子进程出现异常，发现在父进程不退出的情况下，子进程就永远不能退出，即使用任务管理器也不能关闭它。后来尝试先创建一个线程，在CreateProcess()，这样当线程结束后，从任务管理器中可以发现异常的子进程虽然已经退出，但只要父进程还在的话，子进程的exe文件是无法删除的，如果这样的话，OJ系统长时间运行肯定会泄漏很多资源，所以这种办法行不通了。&lt;BR&gt;&lt;BR&gt;在寻找解决办法的时候，突然发现了一个可以对子进程进行有效的CPU和内存控制的办法－－－进程作业对象&lt;BR&gt;具体的步骤是先用CreateJobObject（）创建一个作业对象，然后对该作业对象进行一定的CPU或者内存限制。用作业可以很好的进行内存控制，因为当进程的内存一旦达到限制的大小时，我们就可以得到JOB_OBJECT_MSG_JOB_MEMORY_LIMIT的消息（这里需要用到完成端口来捕获这个消息），而之前的做法是让进程运行直到退出，然后使用psapi中的GetProcessMemoryInfo()来获得进程使用的最大内存，这样不能有效的进行内存限制。&lt;BR&gt;关于CPU的问题，在ACM中，每份代码编译后运行时都会有一个时间限制。算法比较复杂的，可能需要长一点的CPU时间限制，通常每个进程只能够存活1秒到5秒钟。这里有个问题还没弄清楚，例如某条题目限制了时间为1000ms，到底这个1000ms是运算时间还是进程的存活时间？要知道如果我们的进程只是Sleep(1000)的话，那么它占用的CPU时间是不到1000ms的，但是又不能够真的无限等待下去。所以估计这里的1000ms是进程的存活时间，如果在1000ms内进程还没有运算出结果就要把它Kill掉。所以我用了WaitForSingleObject()来处理，当等待了一定时间后，还没收到内核通知就当作进程超时处理。&lt;BR&gt;对于1000ms是CPU时间的话，在作业对象里我从msdn，还有《windows核心编程》里面都说可以进行CPU时间控制，我对照《windows核心编程》里写了个例子，在分配每个作业的CPU时间为1000ms，然后启动一个只执行while(1)的程序，但结果起码过了5秒钟才收到OB_OBJECT_MSG_END_OF_JOB_TIME的消息，难道真的要经过5秒while(1)才用了1秒的CPU时间？（或者里面有些问题我还没弄清楚，请各位高手指教指教）&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/92738.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>zend下无法mysql_connect()的解决办法</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/10/12/81148.html</link><pubDate>Wed, 11 Oct 2006 17:18:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/10/12/81148.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/81148.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/10/12/81148.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/81148.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/81148.html</trackback:ping><description>最近突然想玩玩php，安装了php5＋mysql5＋zend5.2.0，但发现zend下无法使用mysql_connect(),找了好多资料都没有解决办法，最后自己摸索成功&lt;BR&gt;&lt;BR&gt;zend 5.2.0＋php 5.1.6&lt;BR&gt;&lt;BR&gt;先安装php5.1.6，我把php安装在D:\php&lt;BR&gt;再安装zend5.2.0，D:\Program Files\Zend\ZendStudio-5.2.0&lt;BR&gt;&lt;BR&gt;打开D:\Program Files\Zend\ZendStudio-5.2.0\bin\php5&lt;BR&gt;新建一个ext文件夹，把d:\php\ext中的p'hp_curl.dll、php_mysql.dll、php_mysqli.dll复制到D:\Program Files\Zend\ZendStudio-5.2.0\bin\php5\ext&lt;BR&gt;&lt;BR&gt;把d:\php下面的libmysql.dll复制到D:\Program Files\Zend\ZendStudio-5.2.0\bin\php5&lt;BR&gt;用d:\php下面的php5ts.dll替换D:\Program Files\Zend\ZendStudio-5.2.0\bin\php5下的php5ts.dll&lt;BR&gt;&lt;BR&gt;打开D:\Program Files\Zend\ZendStudio-5.2.0\bin\php5下面的php.ini&lt;BR&gt;在最后增加下面两行&lt;BR&gt;extension_dir="D:\Program Files\Zend\ZendStudio-5.2.0\bin\php5\ext"&lt;BR&gt;extension=php_mysql.dll&lt;BR&gt;&lt;BR&gt;OK！重启zend studio，用下面代码测试成功！&lt;IMG src="/blog/Emoticons/shades_smile.gif"&gt;&lt;BR&gt;&lt;BR&gt;&amp;lt;?php &lt;BR&gt;$dbh = mysql_connect('localhost','root','123456'); &lt;BR&gt;mysql_select_db('test',$dbh); &lt;BR&gt;$query = "select * from tt"; &lt;BR&gt;$res = mysql_query($query, $dbh);&lt;BR&gt;$err = mysql_error(); &lt;BR&gt;if($err){ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo "error"; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;$row = mysql_fetch_row($res); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo $row[0]."&amp;nbsp; ".$row[1];&lt;BR&gt;?&amp;gt; &lt;BR&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/81148.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>9月30日噩耗－今天你备份了吗？</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/10/03/75910.html</link><pubDate>Mon, 02 Oct 2006 17:50:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/10/03/75910.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/75910.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/10/03/75910.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/75910.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/75910.html</trackback:ping><description>&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2006年9月30号，我的200G硬盘阵忘了！伴随着差不多100G的数据，瞬间全毁～～～～欲哭无泪！&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;事情经过：9月30号跟往常一样，中午回宿舍打开电脑上上网页，上上Q，因为下午有课，所以上了一下，12点30分去睡觉了。睡醒去上课，4点45分回到电脑，第一时间也是打开电脑，但这次.........&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;按下Ctrl＋F1键开机后，我去了厕所，以为回来就可以看到windows2003的输入密码框，但这次看到的是黑底白字，最后一行写着：error loading system&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;接着按reset重启了一下，照旧，这时我还不是很紧张，以为系统文件错误了，大不了重装一次....&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;拿起工具盘，启动winpe，进去用资源管理器一看，5个分区还在（15，30，45，45，45），但是双击打开一看，里面都没有数据，看一下属性，使用空间全部为0，这下我可傻了眼，心想大事不妙了！但我还是抱着很大的希望，因为我曾经试过在linux下访问windows分区导致一个分区文件全部丢失，但后来用finaldata还是找回了大部分数据。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;接下来，把硬盘拆下来了，接到同学的机器上，但是问题来了，接上去就进不了系统，在检查完IDE设备后就卡住了，这下可晕，又换了一台机器，接上去通过自检了，但windows xp的滚动条刚滚动了两下，就蓝屏了，难道是硬件损坏了吗？？？这下可吓死我了。实在没办法，装回自己的机器，进入winpe，把室友的硬盘装过来（因为假如找到数据，恢复的数据不能写到我的硬盘上，否则会覆盖掉一些暂时还没恢复的数据）。在winpe下打开finaldata，扫描C盘扫了半天，找到200多个文件，这下可完了。无奈之下把C盘格式化了，然后竟然可以接到同学的机里了。接下来扫描G盘（最重要的数据全在这里了），竟然一个文件也找不到，这下我头都冒汗了.....&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;傍晚5点一直弄到晚上11点多，没有半点收获，后来换了easycovery，让它自己扫了一个晚上，希望国庆那天醒来会有收获。国庆早上甚至我发了个梦，说数据没了其实只是个梦，醒来一看同学的电脑的电源灯还亮着，这说明it is real，so real！打开显示器一看，还是没找到文件......完了，彻底完了。后来继续抱着希望，仔细看了easycovery，发现有个raw recover，试一下吧，一点希望也不放过了。选了raw recover后，会询问要恢复哪种类型的文件，我看到有rar，就选择恢复G盘的rar文件，大概5分钟后，发现竟然找到了1000多个文件，但是总共有38G，但全部都是没有文件名的，都是FILE1.RAR，FILE102.RAR这样子的，我晕。后来打开一看，有些rar文件竟然有2G大，有好多都是几百M的，但双击打开测试竟然没问题。于是一个一个打开解压到同学的硬盘里面，但是找到的这些rar也不是最重要的文件，而且有部分是损坏了的。后来用同样的办法找回了一些照片。asp就找不回了，尝试找asp的（因为有些比较重要的），竟然找到6万多个，而且文件名没了，找回来也没用了。估计因为硬盘是新的，以前用80G的硬盘，然后一次性把数据拷到这个200G的硬盘中，rar的数据拷过来后就线性储存起来了，而asp这种类型的文本文件，内容经常变动的，在硬盘中分块储存，所以恢复起来也困难了。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;目录是一个也没有找回.......&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;数据可以说是全毁了&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PS：今天你备份了吗？&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/75910.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>VC下utf8编码和解码</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/28/72288.html</link><pubDate>Thu, 28 Sep 2006 06:59:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/28/72288.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/72288.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/28/72288.html#Feedback</comments><slash:comments>94</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/72288.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/72288.html</trackback:ping><description>&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Convert(string&amp;nbsp;&amp;nbsp;str,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;char&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;p,&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;sourceCodepage,&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;targetCodepage)&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;{&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;str.length();&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;unicodeLen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;MultiByteToWideChar(sourceCodepage,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,str.c_str(),&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,NULL,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;wchar_t&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pUnicode;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;pUnicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;wchar_t[unicodeLen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;];&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;memset(pUnicode,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,(unicodeLen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;sizeof(wchar_t));&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;MultiByteToWideChar(sourceCodepage,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,str.c_str(),&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,(LPWSTR)pUnicode,unicodeLen);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pTargetData&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;BYTE;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;targetLen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;WideCharToMultiByte(targetCodepage,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,(LPWSTR)pUnicode,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;char&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)pTargetData,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,NULL,NULL);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;pTargetData&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE[targetLen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;];&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;memset(pTargetData,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,targetLen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;WideCharToMultiByte(targetCodepage,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,(LPWSTR)pUnicode,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;char&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)pTargetData,targetLen,NULL,NULL);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;sprintf(p,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;%s&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,pTargetData);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;delete&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pUnicode;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;delete&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pTargetData;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;用法&lt;BR&gt;buf为结果&lt;BR&gt;编码&lt;BR&gt;char buf[128];&lt;BR&gt;Convert(str,buf,936,CP_UTF8);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt; 解码&lt;BR&gt;char buf[128];&lt;BR&gt;Convert(str,buf,CP_UTF8,936); &lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/72288.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>利用完成端口做工作线程池</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/24/69126.html</link><pubDate>Sat, 23 Sep 2006 16:55:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/24/69126.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/69126.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/24/69126.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/69126.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/69126.html</trackback:ping><description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;----------------------------------------------------------------&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;数据处理线程&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;----------------------------------------------------------------&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;unsigned&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;_stdcall&amp;nbsp;process_thread(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;lpParam)&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;{&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;HANDLE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comp_port&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(HANDLE)lpParam;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;PVOID&amp;nbsp;UserParam;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PULONG_PTR&amp;nbsp;UserProc;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OVERLAPPED&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;lpOverlapped&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;NULL;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(;;)&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BOOL&amp;nbsp;bRet&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;GetQueuedCompletionStatus(&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_process_port,&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(LPDWORD)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;UserParam,&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(LPDWORD)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;UserProc,&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;lpOverlapped,&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INFINITE);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_ASSERT(bRet);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(UserProc&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;NULL)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&amp;nbsp;Quit&amp;nbsp;signal.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(lpOverlapped&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;NULL)&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMSG(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;GetQueuedCompletionStatus&amp;nbsp;出现错误 &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;continue&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&amp;nbsp;execute&amp;nbsp;user's&amp;nbsp;proc.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;UserProc(UserParam);&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;InterlockedIncrement(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;pmoon&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;m_process_thread_count);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;工作&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;InterlockedDecrement(m_process_thread_count);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;----------------------------------------------------------------&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;队列轮询线程&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;----------------------------------------------------------------&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;unsigned&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;_stdcall&amp;nbsp;check_thread(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;lpParam)&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;{&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;OVERLAPPED&amp;nbsp;Overlapped&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;NULL};&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;CMoonServer&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;pmoon&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(CMoonServer&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)lpParam;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(;;)&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;{&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;Sleep(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(cbuf&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;num&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;||&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;m_process_thread_count&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;m_workthread_num)&amp;nbsp;Sleep(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;10&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&amp;nbsp;DMSG("收到数据包");&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PostQueuedCompletionStatus(m_process_port,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;Overlapped);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;m_process_port&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;CreateIoCompletionPort(INVALID_HANDLE_VALUE,&amp;nbsp;NULL,&amp;nbsp;(ULONG_PTR)NULL,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;创建数据处理线程&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;m_workthread_num;i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;++&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&amp;nbsp;{&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sleep(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;5&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;hthread&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(HANDLE)_beginthreadex(NULL,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;process_thread,(LPVOID)m_process_port,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;NULL);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(hthread&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;NULL){&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;创建数据处理工作线程失败:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;GetLastError()&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;endl;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;SetThreadPriority(hthread,priority);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;CloseHandle(hthread);&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;}&lt;BR&gt;&lt;IMG src="/blog/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/69126.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>谷夕</dc:creator><title>多线程处理数据中,下面哪种方式比价高效率?</title><link>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/23/68921.html</link><pubDate>Sat, 23 Sep 2006 09:25:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/23/68921.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/gxisone/comments/68921.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/gxisone/archive/2006/09/23/68921.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/gxisone/comments/commentRss/68921.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/gxisone/services/trackbacks/68921.html</trackback:ping><description>&lt;P&gt;最近玩完成端口,多线程中想到以下问题&lt;BR&gt;一个队列中,如果想多线程从队列中取出数据进行处理,以下哪种方法比较高效?&lt;/P&gt;
&lt;P&gt;方案一&amp;nbsp; 建立N个线程,每个线程轮询(while无限循环)队列,有数据的话进行处理&lt;/P&gt;
&lt;P&gt;方案二&amp;nbsp; 一个轮询线程,有N个工作线程的线程池,轮询线程查询数据队列,有数据的话取出来,从工作线程池中唤醒一个线程进行数据处理 &lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/gxisone/aggbug/68921.html" width = "1" height = "1" /&gt;</description></item></channel></rss>