??xml version="1.0" encoding="utf-8" standalone="yes"?>99久久免费国产精品热,久久青青草原亚洲av无码app,久久久婷婷五月亚洲97号色http://www.shnenglu.com/xingmuxixi/zh-cnWed, 07 May 2025 16:13:20 GMTWed, 07 May 2025 16:13:20 GMT60Hibernate插入和修Ҏ据到数据库中时不修改存在默认值字D[转]http://www.shnenglu.com/xingmuxixi/archive/2013/03/29/198909.html醒目西西醒目西西Fri, 29 Mar 2013 02:07:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2013/03/29/198909.htmlhttp://www.shnenglu.com/xingmuxixi/comments/198909.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2013/03/29/198909.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/198909.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/198909.html说明Q?/p>

今天在做一个OA的简单增删除该查的时候,有一个时间类型的字段Q数据插入时_Q本w想着Q这个字D늛接中Oracle数据库设|一个Default Value Q就不用再前台installq个字段的gQ但是后旉操作中发现插入的时候如果不通过hqld代码的话Q而是通过hibernate的接口getHibernateTemplate().saveOrUpdate(entity);的话Q就出现问题Q插入的旉cd字段的值是nullQtmd有点郁闷Q不好意思又说脏话了Q也是当时头有点昏,呵呵。后来,一惛_果通过getHibernateTemplate().saveOrUpdate(entity);q个借口Q如果没有设||那么׃讄nullQ所有出Cq个问题。查看了下hibernate的接口文档,一看,原来是这L?/p>

需要添加下面的参数?.hbm.xml中class节点讄Q如?/p>

一是将dynamic-insert讄为true

二是对应字D늚属性设|not-null为false

<hibernate-mapping>
<class name="com.tom.hibernate.xxxx" table="xxx schema="xxx" dynamic-insert="true" dynamic-update="true">

<property name="entryDate" type="java.util.Date">
<column name="ENTRY_DATE" length="7" not-null="false"/>
</property>

用拿来主义)贴过来一个这个接口说明:

下面是有兛_它配|的说明

Hibernate允许我们在映文仉控制insert和update语句的内?比如在映文件中<property 元素中的update属性设|成为false,那么q个字段,不被包括在基本的update语句?修改的时?不包括q个字段?insert同理.dynamic动态SQL语句的配|也是很常用?下面介绍配置SQL语句的具体属?
1)<property>元素 insert属?讄为false,在insert语句中不包含q个字段,表示永远不会被插?默认true
2)<property>元素 update属?讄为false,在update语句中不包含q个字段,表示永远不会被修?默认true
3)<class>元素 mutable属?讄为false是把所有的<property>元素的update属性设|ؓ了false,说明q个对象不会被更?默认true
4)<property>元素 dynamic-insert属?讄为true,表示insert对象的时?生成动态的insert语句,如果q个字段的值是null׃会加入到insert语句当中.默认false
5)<property>元素 dynamic-update属?讄为true,表示update对象的时?生成动态的update语句,如果q个字段的值是null׃会被加入到update语句?默认false
6)<class>元素 dynamic-insert属?讄为true,表示把所有的<property>元素的dynamic-insert属性设|ؓtrue,默认false
7)<class>元素 dynamic-update属?讄为true,表示把所有的<property>元素的dynamic-update属性设|ؓtrue,默认false

Hibernate生成动态SQL语句的消耗的pȝ资源(比如CPU,内存{?是很的,所以不会媄响到pȝ的性能,如果表中包含N多字D?把dynamic-update属性和insert属性设|ؓtrue,q样在插入和修改数据的时?语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时?提高E序的运行效?

另外一U做法请看如下配|:

Hibernate <property>配置

<property name="name" unique="true" not-null="true" update="false" length="25"/>

<property>元素 insert属性:讄为falseQ在insert语句中不包含q个字段Q表C永q不会被插入。默认true?br />
<property>元素 update属性:讄为falseQ在update语句中不包含q个字段Q表C永q不会被修改。默认true?/span>

<class>元素 mutable属性:讄为falseQ就是把所有的<property>元素的update属性设|ؓ了falseQ说明这个对象不会被更新。默认true?br />
<property>元素 dynamic-insert属性:讄为trueQ表Cinsert对象的时候,生成动态的insert语句Q如果这个字D늚值是null׃会加入到insert语句当中。默认false 

<property>元素 dynamic-update属性:讄为trueQ表Cupdate对象的时候,生成动态的update语句Q如果这个字D늚值是null׃会被加入到update语句中。默认false 

<class>元素 dynamic-insert属性:讄为trueQ表C把所有的<property>元素的dynamic-insert属性设|ؓtrue。默认false 

<class>元素 dynamic-update属性:讄为trueQ表C把所有的<property>元素的dynamic-update属性设|ؓtrue。默认false

dynamic-updateQ如果一个表字段比较多,q且l常只是更新一条记录的一两个字段Q避免了q多无用的sql语句Q动态更C更有效。应用程序会增加工作量,但是数据库会减少工作量。在插入和修Ҏ据的时候,语句中只包括要插入或者修改的字段Q可以节省SQL语句的执行时_提高E序的运行效率?/div>

醒目西西 2013-03-29 10:07 发表评论
]]>C#自动实现Dll(OCX)控g注册的两U方?/title><link>http://www.shnenglu.com/xingmuxixi/archive/2011/05/10/146134.html</link><dc:creator>醒目西西</dc:creator><author>醒目西西</author><pubDate>Tue, 10 May 2011 11:56:00 GMT</pubDate><guid>http://www.shnenglu.com/xingmuxixi/archive/2011/05/10/146134.html</guid><wfw:comment>http://www.shnenglu.com/xingmuxixi/comments/146134.html</wfw:comment><comments>http://www.shnenglu.com/xingmuxixi/archive/2011/05/10/146134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/xingmuxixi/comments/commentRss/146134.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/xingmuxixi/services/trackbacks/146134.html</trackback:ping><description><![CDATA[<p>管MS为我们提供了丰富?net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控g库还是需要由W三Ҏ供或是自q写?br>当需要用到Dll引用的时候,我们通常会通过“d引用”的方式将它们U_到项目中Q然后就可以像用自qcMh便的使用它们了?br>但是Q有些Dll?OCX)文g是需要注册到Windows注册表后才能正常d和用的?/p> <p>本文介绍两种为Dll?OCX)自动注册的方法,为大家提供参考?/p> <p>首先Q大安知道在Windows?#8220;q行”中,输入“Regsvr32.exe 路径”q样的方法来手动注册Dll控g(OCX)Q显CU方法对于程序的自动化部|等带来极大的不便,<br>因此Q今天我们着重介l如何用C#实现自动注册?/p> <p>Ҏ一Q调用Regsvr32?/p> <p>既然可以在运行栏中输?#8220;Regsvr32.exe 路径”的方法来注册Q那么,一定可以在C#E序中采用同LҎ来调用Regsvr32Q以实现注册Q?/p> <p>Process p = new Process();<br>p.StartInfo.FileName = "Regsvr32.exe";<br>p.StartInfo.Arguments = "/s C:\\DllTest.dll";//路径中不能有I格<br>p.Start();<br>采用q种ҎQ注意要d对命名空间System.Diagnostics的引用:using System.Diagnostics;<br>另外Q这U方法有一个不之处,那就是注册工作是在本E序之外由Regsvr32.exeE序来完成的Q系l内不方便知道注册的l果Q也不方便对注册q程弹出的对话框q行自定义和控制?br>q里附Regsvr32的参数说明:(感谢|友伍华聪的提醒)</p> <p>regsvr32.exe?2位系l下使用的DLL注册和反注册工具Q用它必须通过命o行的方式使用Q格式是Q?/p> <p>  regsvr32 [/u] [/s] [/n] [/i[:cmdline]] DLL文g?/p> <p>  命o可以?#8220;开?#8594;q行”的文本框中,也可以事先在bat批处理文档中~写好命令。未带Q何参数是注册DLL文g功能Q其它参数对应功能如下:</p> <p>  /uQ反注册DLL文g;</p> <p>  /sQ安静模?Silent)执行命oQ即在成功注?反注册DLL文g前提下不昄l果提示框?/p> <p>  /cQ控制端?</p> <p>  /iQ在使用/u反注册时调用DllInstall;</p> <p>  /nQ不调用DllRegisterServerQ必M/iq用?/p> <p> </p> <p>Ҏ二:调用DllRegisterServer函数?/p> <p> 研究Regsvr32.exe和Dll文gQ我们会发现Q其实每个需要注册的文g都包括一个DllRegisterServer()ҎQRegsvr32.exe是通过调用该方法来完成Dll的注册的?br>知道了这个,我们可以自p用DllRegisterServer()来完成注册过E啦?/p> <p>首先Q还得引入外部方法:</p> <p>[DllImport("DllTest.dll")]<br>public static extern int DllRegisterServer();//注册时用<br>[DllImport("DllTest.dll")]<br>public static extern int DllUnregisterServer();//取消注册时用</p> <p>接下来就不难啦:int i = DllRegisterServer();<br>if (i >= 0)<br>{<br>    //注册成功!<br>}<br>else<br>{<br>    //注册p|<br>}<br>取消注册的过E就不应再脓代码啦?br> </p> <p>如何对Dll是否已经注册q了做出判断Q?br>一般情况下Q我们可以将对Dll控g的注册过E放在系l启动的q程中来完成Q但是,M能每ơ启动都注册一ơ吧Q这样做昄不合理?br>那么Q我们就来判断一下,当前Dll是否已经注册q,如果已注册过Q就跌注册q程?/p> <p>每一个Dll的注册都会在注册表里记录下有兛_本n的资料,如注册\径,唯一ID{。我们这里就是利用它留下的唯一IDh判断Q?/p> <p>RegistryKey rkTest = Registry.ClassesRoot.OpenSubKey("CLSID\\{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}\\");<br>if (rkTest == null)<br>{  <br> //Dll没有注册Q在q里调用DllRegisterServer()?br>?br>注意要添加对命名I间Microsoft.Win32的引用:using Microsoft.Win32;</p> <p>其中?#8220;{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}”是该Dll的唯一ID啦,每一个Dll文g都会不一L?/p> <p>但是Q问题又来了Q怎么L道它的唯一ID呢?其实很简单,那就?#8220;逆向思维”?br>我们可先注册q个Dll文gQ然后到注册表的“HKEY_CLASSES_ROOT\CLSID”分支?#8220;查找”Dll的名U或路径Q就可以看到q个ID啦? </p> <br> <img src ="http://www.shnenglu.com/xingmuxixi/aggbug/146134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/xingmuxixi/" target="_blank">醒目西西</a> 2011-05-10 19:56 <a href="http://www.shnenglu.com/xingmuxixi/archive/2011/05/10/146134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#跨线E调用窗体控件的问题http://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140735.html醒目西西醒目西西Sun, 27 Feb 2011 06:06:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140735.htmlhttp://www.shnenglu.com/xingmuxixi/comments/140735.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140735.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/140735.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/140735.html 前段旉遇到跨线E调用窗体控件的问题Q其实一句话System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;可以解冻I但感觉会有不E_因素Q因此在|上找了一些相应的文章感觉q不错,W一U用的比较顺手:

(注:在devexpress控g中用DevExpress.Data.CurrencyDataController.DisableThreadingProblemsDetection = true;)

    用户不喜Ƣ反应慢的程序。在执行耗时较长的操作时Q用多U程是明Z举,它可以提高程?UI 的响应速度Q得一切运行显得更为快速。在 Windows 中进行多U程~程曄?C++ 开发h员的专属ҎQ但是现在,可以使用所有兼?Microsoft .NET 的语a来编写?/p>

不过Windows H体体系l构对线E用制定了严格的规则。如果只是编写单U程应用E序Q则没必要知道这些规则,q是因ؓ单线E的代码不可能违反这些规则。然而,一旦采用多U程Q就需要理?Windows H体中最重要的一条线E规则:除了极少数的例外情况Q否则都不要在它的创建线E以外的U程中用控件的M成员。本规则的例外情冉|文档说明Q但q样的情况非常少。这适用于其cL生自 System.Windows.Forms.Control 的Q何对象,其中几乎包括 UI 中的所有元素。所有的 UI 元素Q包括表单本w)都是?Control cL生的对象。此外,q条规则的结果是一个被包含的控Ӟ如,包含在一个表单中的按钮)必须与包含它控g位处于同一个线E中。也是_一个窗口中的所有控件属于同一?UI U程。实际中Q大部分 Windows H体应用E序最l都只有一个线E,所?UI zd都发生在q个U程上。这个线E通常UCؓ UI U程。这意味着您不能调用用L面中L控g上的MҎQ除非在该方法的文档说明中指出可以调用。该规则的例外情况(L文档记录Q非常少而且它们之间关系也不大。请注意Q以下代码是非法的:

        private Thread myThread;

        private void Form1_Load(object sender, EventArgs e)

        {

            myThread = new Thread(new ThreadStart(RunsOnWorkerThread));

            myThread.Start();

        }

        private void RunsOnWorkerThread()

        {

            label1.Text = "myThreadU程调用UI控g";

    }

如果您在 .NET Framework 1.0 版本中尝试运行这D代码,也许会oq运行成功,或者初看v来是如此。这是多线E错误中的主要问题,卛_们ƈ不会立即昄出来。甚臛_出现了一些错误时Q在W一ơ演C程序之前一切看h也都很正常。但不要搞错 ?我刚才显C的q段代码明显q反了规则,q且可以预见QQ何抱希望?#8220;试运行时良好Q应该就没有问题”的h在即到来的调试期是会付出沉重代L?/p>

下面我们来看看有哪些Ҏ可以解决q一问题?/p>

一、System.Windows.Forms.MethodInvoker cd是一个系l定义的委托Q用于调用不带参数的Ҏ?br>        private Thread myThread;

        private void Form1_Load(object sender, EventArgs e)

        {

            myThread = new Thread(new ThreadStart(RunsOnWorkerThread));

            myThread.Start();

        }

        private void RunsOnWorkerThread()

        {

            MethodInvoker mi = new MethodInvoker(SetControlsProp);

            BeginInvoke(mi);

        }

        private void SetControlsProp()

        {

            label1.Text = "myThreadU程调用UI控g";

        }

 

二、直接用System.EventHandleQ可带参敎ͼ

        private Thread myThread;

        private void Form1_Load(object sender, EventArgs e)

        {

            myThread = new Thread(new ThreadStart(RunsOnWorkerThread));

            myThread.Start();

        }

        private void RunsOnWorkerThread()

        {

            //DoSomethingSlow();

            string pList = "myThreadU程调用UI控g";

            label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);

        }

        //直接用System.EventHandler,没有必要自定义委?/p>

        private void UpdateUI(object o, System.EventArgs e)

        {

           //UIU程讄label1属?/p>

            label1.Text = o.ToString() + "成功!";

        }

三、包?Control.Invoke

虽然W二个方法中的代码解决了q个问题Q但它相当繁琐。如果辅助线E希望在l束时提供更多的反馈信息Q而不是简单地l出“Finished!”消息Q则 BeginInvoke q于复杂的用方法会令h生畏。ؓ了传辑օ他消息,例如“正在处理”?#8220;一切顺?#8221;{等Q需要设法向 UpdateUI 函数传递一个参数。可能还需要添加一个进度栏以提高反馈能力。这么多ơ调?BeginInvoke 可能D辅助U程受该代码支配。这样不仅会造成不便Q而且考虑到辅助线E与 UI 的协调性,q样设计也不好。对q些q行分析之后Q我们认为包装函数可以解册两个问题?/p>

        private Thread myThread;

        private void Form1_Load(object sender, EventArgs e)

        {

            myThread = new Thread(new ThreadStart(RunsOnWorkerThread));

            myThread.Start();

        }

        private void RunsOnWorkerThread()

        {

            ////DoSomethingSlow();

            for (int i = 0; i < 100; i++)

            {

                ShowProgress( Convert.ToString(i)+"%", i);

                Thread.Sleep(100);

            }

        }

        public void ShowProgress(string msg, int percentDone)

        {

            // Wrap the parameters in some EventArgs-derived custom class:

            System.EventArgs e = new MyProgressEvents(msg, percentDone);

            object[] pList = { this, e };

 

            BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);

        }

        private delegate void MyProgressEventsHandler(object sender, MyProgressEvents e);

        private void UpdateUI(object sender, MyProgressEvents e)

        {

            lblStatus.Text = e.Msg;

            myProgressControl.Value = e.PercentDone;

       }

    public class MyProgressEvents : EventArgs

    {

        public string Msg;

        public int PercentDone;

        public MyProgressEvents(string msg, int per)

        {

            Msg = msg;

            PercentDone = per;

        }

}

ShowProgress Ҏ对将调用引向正确U程的工作进行封装。这意味着辅助U程代码不再担心需要过多关?UI l节Q而只要定期调?ShowProgress 卛_?/p>

如果我提供一个设计ؓ可从MU程调用的公共方法,则完全有可能某h会从 UI U程调用q个Ҏ。在q种情况下,没必要调?BeginInvokeQ因为我已经处于正确的线E中。调?Invoke 完全是浪Ҏ间和资源Q不如直接调用适当的方法。ؓ了避免这U情况,Control cd公开一个称?InvokeRequired 的属性。这?#8220;只限 UI U程”规则的另一个例外。它可从MU程dQ如果调用线E是 UI U程Q则q回假,其他U程则返回真。这意味着我可以按以下方式修改包装Q?

        public void ShowProgress(string msg, int percentDone)

        {

            if (InvokeRequired)

            {

                // As before

                //...

            }

            else

            {

                // We're already on the UI thread just

                // call straight through.

                UpdateUI(this, new MyProgressEvents(msg,PercentDone));

            }

        }

 

本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/jackey0517/archive/2009/09/08/4533458.aspx



醒目西西 2011-02-27 14:06 发表评论
]]>
C#中跨U程操作控g时Invoke和BeginInvoke 区别http://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140734.html醒目西西醒目西西Sun, 27 Feb 2011 06:05:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140734.htmlhttp://www.shnenglu.com/xingmuxixi/comments/140734.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140734.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/140734.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/140734.htmlControl.Invoke Ҏ (Delegate):?strong>拥有此控件的基础H口句柄的线E上执行指定的委托?/span>

Control.BeginInvoke Ҏ (Delegate) :?strong>创徏控g的基句柄所在线E上异步执行指定委托?/span>

(一QControl的Invoke和BeginInvoke
我们要基于以下认识:
Q?QControl的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的?br>Q?QControl的Invoke和BeginInvoke的参CؓdelegateQ委托的Ҏ是在Control的线E上执行的,也就是我们^时所说的UIU程?br>
我们以代?一)来看(Control的Invoke)
private delegate void InvokeDelegate();
private void InvokeMethod(){
   //C代码D?br>}
private void butInvoke_Click(object sender, EventArgs e) {
   //A代码D?......
   this.Invoke(new InvokeDelegate(InvokeMethod));
   //B代码D?.....
}
你觉得代码的执行序是什么呢?记好Control的Invoke和BeginInvoke都执行在ȝE即UIU程?br>A------>C---------------->B
解释Q?1)A在UIU程上执行完后,开始InvokeQInvoke是同?br>(2)代码DBq不执行Q而是立即在UIU程上执行InvokeMethodҎQ即代码DC?br>(3)InvokeMethodҎ执行完后Q代码段C才在UIU程上l执行?br>
看看代码(?QControl的BeginInvoke
private delegate void BeginInvokeDelegate();
private void BeginInvokeMethod(){
   //C代码D?br>}
private void butBeginInvoke_Click(object sender, EventArgs e) {
   //A代码D?......
   this.BeginInvoke(new BeginInvokeDelegate(BeginInvokeMethod));
   //B代码D?.....
}

你觉得代码的执行序是什么呢?记好Control的Invoke和BeginInvoke都执行在ȝE即UIU程?br>A----------->B--------------->C慎重Q这个只做参考。。。。。,我也不肯定执行顺序,如果有哪位达人知道的话请告知?/span>
解释Q:(1)A在UIU程上执行完后,开始BeginInvokeQBeginInvoke是异?br>(2)InvokeMethodҎQ即代码DC不会执行Q而是立即在UIU程上执行代码段B?br>(3)代码DB执行完后(是说butBeginInvoke_ClickҎ执行完后)QInvokeMethodҎQ即代码DC才在UIU程上l执行?br>
由此Q我们知道:
Control的Invoke和BeginInvoke的委托方法是在主U程Q即UIU程上执行的。也是说如果你的委托方法用来取p旉长的数据Q然后更新界面什么的Q千万别在UIU程上调用Control.Invoke和Control.BeginInvokeQ因些是依然dUIU程的,造成界面的假歅R?br>
那么Q这个异步到底是什么意思呢?

异步是指相对于调用BeginInvoke的线E异步,而不是相对于UIU程异步Q你在UIU程上调用BeginInvoke Q当然不行了。-Q-Q摘?Invoke和BeginInvoke的真正涵?一文中的评论?br>BeginInvoke的原理是调用的ҎMarshal成消息,然后调用Win32 API中的RegisterWindowMessage()向UIH口发送消息。-Q-Q摘?Invoke和BeginInvoke的真正涵?一文中的评论?br>
(?我们用Thread来调用BeginInvoke和Invoke
      我们开一个线E,让线E执行一些耗费旉的操作,然后再用Control.Invoke和Control.BeginInvoke回到用户UIU程Q执行界面更新?br>
代码(?  Thread调用Control的Invoke
private Thread invokeThread;
private delegate void invokeDelegate();
private void StartMethod(){
   //C代码D?.....
   Control.Invoke(new invokeDelegate(invokeMethod));
  //D代码D?.....
}
private void invokeMethod(){
  //E代码D?br>}
private void butInvoke_Click(object sender, EventArgs e) {
   //A代码D?......
   invokeThread = new Thread(new ThreadStart(StartMethod));
   invokeThread.Start();
   //B代码D?.....
}

你觉得代码的执行序是什么呢?记好Control的Invoke和BeginInvoke都执行在ȝE即UIU程?br>A------>(Start一开始B?span style="COLOR: #ff0000">StartMethod?/span>C同时执?---->(C执行完了Q不B有没有执行完QinvokeThread把消息封?invoke)lUIU程Q然后自q?---->UIU程处理?span style="COLOR: #0000ff">butInvoke_Click消息后,处理invokeThread送过来的消息Q执行invokeMethodҎQ即代码DEQ处理往后UIU程切换到invokeThreadU程?br>q个Control.Invoke是相对于invokeThreadU程同步的,L了其q行?br>
解释Q?br>1。UI执行A
2。UI开U程InvokeThreadQB和C同时执行QB执行在线EUI上,C执行在线EinvokeThread上?br>3。invokeThread送消息给UIQ然后自q待,UI处理完消息后Q处理invokeThread送的消息Q即代码DE
4。UI执行完E后,转到U程invokeThread上,invokeThreadU程执行代码DD

代码(?  Thread调用Control的BeginInvoke
private Thread beginInvokeThread;
private delegate void beginInvokeDelegate();
private void StartMethod(){
   //C代码D?.....
   Control.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod));
  //D代码D?.....
}
private void beginInvokeMethod(){
  //E代码D?br>}
private void butBeginInvoke_Click(object sender, EventArgs e) {
   //A代码D?......
   beginInvokeThread = new Thread(new ThreadStart(StartMethod));
   beginInvokeThread .Start();
   //B代码D?.....
}
你觉得代码的执行序是什么呢?记好Control的Invoke和BeginInvoke都执行在ȝE即UIU程?br>A在UIU程上执?---->beginInvokeThreadU程开始执行,UIl箋执行代码DBQƈ发地invokeThread执行代码DC-------------->不管UI有没有执行完代码DBQ这时beginInvokeThreadU程把消息封送给UIQ单自己q不{待Ql向下执?------->UI处理?span style="COLOR: #0000ff">butBeginInvoke_Click消息后,处理beginInvokeThreadU程送过来的消息?br>


解释Q?br>1。UI执行A
2。UI开U程beginInvokeThreadQB和C同时执行QB执行在线EUI上,C执行在线EbeginInvokeThread上?br>3。beginInvokeThread送消息给UIQ然后自ql执行代码DQUI处理完消息后Q处理invokeThread送的消息Q即代码DE
有点疑问Q如果UI先执行完毕,是不是有可能q了D|间beginInvokeThread才把消息送给UIQ然后UI才l执行封送的消息E。如图浅l的部分?/span>


Control的BeginInvoke是相对于调用它的U程Q即beginInvokeThread相对是异步的?br>因此Q我们可以想到。如果要异步取耗费长时间的数据Q比如从数据库中d量数据,我们应该q么做?br>
(1)如果你想L调用U程Q那么调用代??Q代码段D删掉QC改ؓ耗费长时间的操作Q因个操作是在另外一个线E中做的。代码段E改ؓ更新界面的方法?br>(2)如果你不想阻止调用线E,那么调用代码(?Q代码段D删掉QC改ؓ耗费长时间的操作Q因个操作是在另外一个线E中做的。代码段E改ؓ更新界面的方法?br>

==============================以上是原?============================

       我认Z?#8220;代码?#8221;l出的运行结果是正确的。我来做个ȝQ委托的同步和异步的区别Q只有在多线E中才能体现的出来。以跨线E操作控件ؓ例,采用异步时则向UIU程发送一个消息,然后该干嘛干嘛,q个消息什么时候会得到相应是不一定的。如果采用同步执行则向UIU程发送一个消息,然后一直等待,直到q个消息被相应后才接着向下执行。也是_在不跨线E的时?在UIU程中操作控?同步和异步是没有区别的,当然Q不跨线E就可以直接操作控g了,没必要利用委托?/span>



醒目西西 2011-02-27 14:05 发表评论
]]>
一个ȝ理的11个经兔R试问?/title><link>http://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140732.html</link><dc:creator>醒目西西</dc:creator><author>醒目西西</author><pubDate>Sun, 27 Feb 2011 05:11:00 GMT</pubDate><guid>http://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140732.html</guid><wfw:comment>http://www.shnenglu.com/xingmuxixi/comments/140732.html</wfw:comment><comments>http://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/xingmuxixi/comments/commentRss/140732.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/xingmuxixi/services/trackbacks/140732.html</trackback:ping><description><![CDATA[<p>一个ȝ理的11个经兔R试问?/p> <p>孙子曎ͼ“兵者,国之大事Q死生之圎ͼ存亡之道Q不可不察也?#8221;当代C会Q应聘一个岗位,犹如与敌国打仗。准备打仗的旉与打仗时间之比应?0Q?Q甚x100Q?。故Q我们不得不q也?/p> <p>最q,自己面试了上百个大学生,觉得他们在面试的心态和技能方面急需提高Q以侉K利通过q一养Iq入人生的第一个职业。面试过E中Q我会向应聘者发问,而应聘者的回答成为我考虑是否接受他的重要依据。对应聘者而言Q了解这些问题背后的目的臛_重要?/p> <p>问题一Q?#8220;请你自我介绍一?#8221;</p> <p>q个问题的面试方法是Q应聘者站h用五分钟的时间面对大家进行演讌Ӏ?/p> <p>我的目的是:了解应聘者的心理承受能力、逻辑思维能力、演讲能力,而他的生q介l却是其ơ的Q因为,我们在他的简历中已经对其有所了解?/p> <p>应聘者应该做刎ͼ1、介l内容要与个人简历相一致?2、表q方式上量口语化?3、要切中要害Q不谈无兟뀁无用的内容?4、条理要清晰Q层ơ要分明?、要有训l有素的演讲语气和肢体语aQ这是最重要的?/p> <p>问题二:“你有什么业余爱好?”</p> <p>我的目的是:了解应聘者的性格、观c心态、思维的深度等。ؓ了深入了解应聘者的爱好E度Q我会提出更加深ȝ问题Q比如,应聘者喜Ƣ流行音乐,我就会问相关的问题:“您什么时候开始喜Ƣ的Q您最喜欢哪个歌手Q她的演唱风格如何?她的成名曲是哪一首?您最喜欢她的哪一首歌ԌZ么?”一个真正有q方面业余爱好的应聘者应该对{如,遗憾的是Q许多应聘者不能做到?/p> <p>有的应聘者喜Ƣ读书,我的相关问题更加尖锐:“您最喜欢哪一位作Ӟ您最喜欢q个作家的哪一本书Q这本书的中心思想是什么?您阅Mq本书后有什么感悟?对h生的启示又是什么?”能够应答q类问题的应聘者寥寥无几?/p> <p>应聘者应该做刎ͼ1、事先做好这斚w的准备??最好不要说自己没有业余爱好?3?不要说自己有那些怿的、o人感觉不好的爱好?/p> <p>问题三:“谈谈你的~点”</p> <p>我的目的是:了解应聘者是否认真思考过自己Q分析过自己Q反省过自己。如果一个h能认清自q~点Qƈ有改q的愿望和方法,他可能是一个不可多得的人才?/p> <p>应聘者应该做刎ͼ1?不宜说自己没有缺点,因ؓZ定有~点的,除非是神?、不宜说Z重媄响所应聘工作的缺炏V?3、对于自q正的~点Q就认真对其q行剖析Qƈ用积极的心态去面对Q去修炼?/p> <p>问题四:“举一个h生中最p|的经?#8221;</p> <p>我的目的是:了解应聘者的胆量和勇气,是否陷入了选择性知觉的陷阱Q是否进行了深刻的反省,是否接受了深ȝ教训?/p> <p>应聘者应该做刎ͼ 1?不宜说自己没有失败的l历??宜说明失败之前自己曾信心白倍、尽心尽力?3?明确说明p|是主要由主观原因D的?4?p|后自己曾做了深刻的反省,很快振作hQ以更加饱满的热情面对以后的学习或工作?/p> <p>问题五:“你ؓ什么选择我们公司Q?#8221;</p> <p>我的目的是:了解应聘者求职的动机、愿望以及对此项工作的态度。我十分ƣ赏Ҏ公司很了解的应聘者?/p> <p>应聘者应该做刎ͼ1?从行业、企业和岗位q三个角度来回答?2?参考答案—?#8220;我十分看好贵公司所在的行业Q我认ؓ贵公司十分重视h才,而且q项工作很适合我,怿自己一定能做好?#8221;</p> <p>问题六:“对这工作,你有哪些可预见的困难Q?#8221;</p> <p>我的目的是:应聘者的预测能力Qƈ有应Ҏ法。绝大多数的应聘者做不到?/p> <p>应聘者应该做刎ͼ 1?从技术、知识、经验等斚w预见到的困难?、说己对困难所持有的态度Q?#8220;工作中出C些困难是正常的,也是隑օ的,但是只要有坚忍不拔的毅力、勤奋的学习态度Q良好的合作_以及事前周密而充分的准备QQ何困N是可以克服的?#8221;</p> <p>问题七:“在工作中Q与上意见不一_你将怎么办?”</p> <p>我的目的是:了解应聘者的执行力,人际关系的沟通能力和协调能力Q对工作的责L?/p> <p>应聘者应该做刎ͼ 1、首先给上以必要的、私下的解释和提醒,在无效的情况下,又不会给公司造成重大损失Q我会服从上U的意见?2?如果上的决定会l公叔R成重大损失Q而我的解释和提醒无效Ӟ我希望能向更高层领导反映?/p> <p>问题八:“我们Z么要录用你?”</p> <p>我的目的是:应聘者是否能够站在招聘单位的角度来回{,善解人意?/p> <p>应聘者应该做刎ͼ1、企业会录用q样的应聘者:基本W合条g、对q䆾工作感兴、有_的信心?2、说q观点Q?#8220;我符合贵公司的招聘条Ӟ凭我目前掌握的知识、技能、高度的责Q感、良好的适应能力及学习能力,完全能胜任这份工作。我十分希望能ؓ贵公司服务,如果贵公司给我这个机会,我一定能成ؓ贵公司的栋梁Q?#8221;</p> <p>问题九:“你是应届毕业生,~Zl验Q如何能胜Qq项工作Q?#8221;</p> <p>我的目的是:我ƈ不真正在?#8220;l验”Q关键是应聘者的心态,是否有克服自w困隄信心和决心,工作是否有责L?/p> <p>应聘者应该做刎ͼ1?对这个问题的回答最好要体现出应聘者的诚恳、机智、果敢及敬业?2、说q观点Q?#8220;作ؓ应届毕业生,在工作经验方面的会有所Ơ缺Q因此在M期间Q我一直利用各U机会在q个行业里做D。我也发玎ͼ实际工作q比书本知识丰富、复杂。但我有较强的责d、适应能力和学习能力,而且比较勤奋Q所以在D中均能圆满完成各工作,从中获取的经验也令我受益非浅。请贵公司放心,学校所学及D的工作经验我一定能胜Qq个职位?#8221;</p> <p>问题十:“你希望与什么样的上U共事?”</p> <p>我的目的是:通过应聘者对上?#8220;希望”可以判断出应聘者对自我要求的意识,q既上一个陷阱,又上一ơ机会?/p> <p>应聘者应该做刎ͼ1、最好回避对上具体的希望,多谈对自q要求?2?作ؓ刚步入社会的ChQ我应该多要求自己尽快熟悉环境、适应环境Q而不应该对环境提Z么要求,只要能发挥我的专长就可以了?/p> <p>问题十一Q?#8220;您在前一家公司的职原因是什么?”</p> <p>我的目的是:应聘者是有感恩的心态,q是有仇恨的心态。特别鄙视那些应聘者,他们用极其不良的心态来贬低自己职的公司?/p> <p>应聘者应该做刎ͼ1、避免把“职原因”说得太详l、太具体??不能掺杂主观的负面感受,?#8220;太幸?#8221;?#8220;人际关系复杂”?#8220;理太؜?#8221;?#8220;公司不重视h?#8221;?#8220;公司排斥我们某某的员?#8221;{?3、但也不能躲闪、回避,?#8220;x换环?#8221;?#8220;个h原因”{?4、不能涉及自p面的人格特征Q如不诚实、懒惰、缺乏责L、不随和{?5、尽量解释的理׃ؓ应聘者个人Ş象添彩,?#8220;我离职是因ؓq家公司倒闭。我在公司工作了三年多,有较q感情。从d始,׃市场形势H变Q公司的局面急{直下。到gq一步我觉得很遗憾,但还是要面对的,所以,我想重新L能发挥我能力的舞台?#8221;</p> <p>同一个面试问题ƈ非只有一个答案,而同一个答案ƈ不是在Q何面试场合都有效Q关键在于应聘者掌握了规律后,寚w试的具体情况q行把握Q有意识地揣摩面试官提出问题的心理背景,然后投其所好?/p> <p>最后,我要最重要的一点,是应聘者的职业道d。有一个应聘故事很能说明问题?/p> <p>城中最大的一家外商独资企业招?名技术h员的消息不胫而走Q该岗位的待遇是月工?000元,工资奖金除外Q每q还可以到大z彼岔R光一ơ。所以,报考者蜂拥而至?/p> <p>七月火Q?某厂的高工坐在闷|似的考场里,蒸腾的暑气加上躁热的心情Q热汗淋漓。但是,面对考题他ƈ不怵,外文、专业技术类考题都答得十分圆满。惟有第二张考卷的两道怪题令他头疼Q?"您所在的企业或曾任职q的企业l营成功的诀H是什?技术秘密是什?"</p> <p>q类题对于曾在企业搞q技术的应考者ƈ不难Q可高工手中的笔却始l高悬着Q捏来攥去,q迟落不下去。多q的职业道d在约束着他:“厂里的数癑֐职工q在惨El营Q我怎能Z自己的饭而砸大家的饭呢? ”他心中似L倒vQ毅然挥W在考卷上写?个大字:“无可奉告?#8221;</p> <p>高工拖着沉重的步子向安Ud着Q进门后Q妻子一再追问,他才道出了答题的苦衷。全家h默默无语?/p> <p>正当高工q日奔LQ另谋职业之际,石破天惊Q外商独资企业发来了录用通知。高工技压群雄,白卷夺冠Q众议纷UP成ؓ城一大新闅R?/p> <p>高工的职业道德多高啊Q所谓职业道P是同h们的职业zd紧密联系的符合职业特Ҏ要求的道德准则、道h操与道d品质的dQ它既是Ҏ职h员在职业zd中行为的要求Q同时又是职业对C会所负的道d责Q与义务?/p> <p>Z么洁w自q人受人尊敬?因ؓ他们不拿原则q行交易。透支职业道d是拿原则做交易Q这L人和战场上的叛徒一样可怕,随时都会成ؓ不安全隐患。因此,在你职业生中一定要时刻牢记Q你要像保护你的生命一样遵守职业道P永远不要犯原则性错误?br> </p> <p><br>本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/andylin02/archive/2009/10/26/4728891.aspx</a></p> <img src ="http://www.shnenglu.com/xingmuxixi/aggbug/140732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/xingmuxixi/" target="_blank">醒目西西</a> 2011-02-27 13:11 <a href="http://www.shnenglu.com/xingmuxixi/archive/2011/02/27/140732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据存储http://www.shnenglu.com/xingmuxixi/archive/2010/03/17/109863.html醒目西西醒目西西Tue, 16 Mar 2010 17:16:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2010/03/17/109863.htmlhttp://www.shnenglu.com/xingmuxixi/comments/109863.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2010/03/17/109863.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/109863.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/109863.html
呵呵Q对Q只有有W号的整数才有原码、反码和补码的!其他的类型一概没有。虽然我们也可以用二q制中最的数去对应最的负数Q最大的也相对应Q但是那样不U学Q下面来说说U学的方法。还是说一个字节的整数Q不q这ơ是有符L啦,1个字节它不管怎么栯是只能表C?56个数Q因为有W号所以我们就把它表示成范_-128-127。它在计机中是怎么储存的呢Q可以这L解,用最高位表示W号位,如果?表示正数Q如果是1表示负数Q剩下的7位用来储存数的绝对值的话,能表C?7个数的绝对|再考虑正负两种情况Q?7*2q是256个数。首先定?在计机中储存ؓ00000000Q对于正数我们依然可以像无符h那样换算Q从00000001?1111111依次表示1?27。那么这些数对应的二q制码就是这些数的原码。到q里很多人就会想Q那负数是不是从10000001?1111111依次表示-1?127Q那你发现没有,如果q样的话那么一共就只有255个数了,因ؓ10000000 的情冉|有考虑在内。实际上Q?0000000在计机中表C最的负整敎ͼ是q里?128Q而且实际上ƈ不是?0000001?1111111 依次表示-1?127Q而是刚好相反的,?0000001?1111111依次表示-127?1。负整数在计机中是以补码Ş式储存的Q补码是怎么栯C的呢,q里q要引入另一个概念——反码,所谓反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,单的说就是绝对值相同的数原码相同)各个位按位取反,?换?Q是0换?Q如-1的原码是00000001Q和1的原码相同,那么-1的反码就?1111110Q而补码就是在反码的基上加1Q即-1的补码是11111110+1=11111111Q因此我们可以算?1在计机中是?1111111储存的。ȝ一下,计算机储存有W号的整数时Q是用该整数的补码进行储存的Q?的原码、补码都?Q正数的原码、补码可以特D理解ؓ相同Q负数的补码是它的反码加1。下面再多D几个例子Q来帮助大家理解Q?br>
十进?→ 二进?Q怎么?要是不知道看计算机基的书去)
47 → 101111

有符L整数 原码 反码 补码
47 00101111 11010000 00101111Q正数补码和原码相同Q?br>Q?7 00101111 11010000 11010001Q负数补码是在反码上?Q?br>
再D个例子,学C语言的同学应该做q这道题Q?br>把-1以无W号的类型输出,得什么结果?Q程序如下)

#include<iostream.h>
void main()
{
short int n=-1;
cout<<(unsigned short int)n<<endl;
}

首先在我的电脑中short intcd的储存空间是2个字节,你的可能不同Q我说过Q这取决于你的计机配置。它能储?8*2Q?5536个不同的数据信息Q如果是无符号那么它的范围是0~65535Q?~216-1Q,如果是有W号Q那么它的范围是-32768~32767Q?215~215-1Q。这道题目中Q开始n是一个有W号的短整型变量Q我们给它赋gؓ-1Q根据我们前面所说的Q它在计机中是以补?1111111 11111111储存的,注意前面说了?个字节。如果把它强制ؓ无符L短整型输出的话,那么我们把刚才的二q制把看成无W号的整型在计算Z储存的Ş式,对待无符L整型没有什么原码、反码和补码的概念了Q直接把11111111 11111111转化成十q制是65535Q其实我们一看都是一q道它是范围中最大的一个数了。呵呵,p么简单。你个把上面的源代码~译q行看看Q如果你的电脑short int也是两个字节Q那׃和我得一Ll果。你可以先用q个语句看看Qcout<<sizeof(short int)<<endl;看看你的电脑里的短整型占多少的储存空_也可以用sizeof来看其它Mcd所分配的储存空间?br>
最后提醒一句,关于数据如何在计机中储存的Q这里只适用于整型的数据Q对于Q点型的是另一U方式,q里我们暂时׃q?

醒目西西 2010-03-17 01:16 发表评论
]]>
Unicode:宽字节字W集http://www.shnenglu.com/xingmuxixi/archive/2010/03/06/109007.html醒目西西醒目西西Fri, 05 Mar 2010 16:59:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2010/03/06/109007.htmlhttp://www.shnenglu.com/xingmuxixi/comments/109007.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2010/03/06/109007.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/109007.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/109007.html1. 如何取得一个既包含单字节字W又包含双字节字W的字符串的字符个数Q?br>可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符丌Ӏ?br>调用strlen函数Q无法真正了解字W串中究竟有多少字符Q它只能告诉你到辄0之前有多个字节?

2. 如何对DBCS(双字节字W集)字符串进行操作?
函数 描述
PTSTR CharNext ( LPCTSTR ); q回字符串中下一个字W的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR )Q?q回字符串中上一个字W的地址
BOOL IsDBCSLeadByte( BYTE )Q?如果该字节是DBCS字符的第一个字节,则返回非0?

3. Z么要使用UnicodeQ?br>(1) 可以很容易地在不同语a之间q行数据交换?br>(2) 使你能够分配支持所有语a的单个二q制.exe文g或DLL文g?br>(3) 提高应用E序的运行效率?br>Windows 2000是用Unicode从头q行开发的Q如果调用Q何一个Windows函数q给它传递一个ANSI字符Ԍ那么pȝ首先要将字符串{换成UnicodeQ然后将Unicode字符串传递给操作pȝ。如果希望函数返回ANSI字符Ԍpȝ׃首先Unicode字符串{换成ANSI字符Ԍ然后结果返回给你的应用E序。进行这些字W串的{换需要占用系l的旉和内存。通过从头开始用Unicode来开发应用程序,p够你的应用E序更加有效地运行?br>Windows CE 本n是使用Unicode的一U操作系l,完全不支持ANSI Windows函数
Windows 98 只支持ANSIQ只能ؓANSI开发应用程序?br>Microsoft公司COM?6位Windows转换成Win32Ӟ公司军_需要字W串的所有COM接口Ҏ都只能接受Unicode字符丌Ӏ?

4. 如何~写Unicode源代码?
Microsoft公司为Unicode设计了WindowsAPIQ这P可以量减少代码的媄响。实际上Q可以编写单个源代码文gQ以便用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE)Q就可以修改然后重新~译该源文g?br>_UNICODE宏用于Cq行期头文gQ而UNICODE宏则用于Windows头文件。当~译源代码模块时Q通常必须同时定义q两个宏?

5. Windows定义的Unicode数据cd有哪些?
数据cd 说明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据cd为CHARQLPSTR和LPCSTR?br>ANSI/Unicode通用数据cd为TCHARQPTSTR,LPCTSTR?

6. 如何对Unicodeq行操作Q?br>字符?Ҏ?实例
ANSI 操作函数以str开?strcpy
Unicode 操作函数以wcs开?wcscpy
MBCS 操作函数以_mbs开?_mbscpy
ANSI/Unicode 操作函数以_tcs开?_tcscpy(Cq行期库)
ANSI/Unicode 操作函数以lstr开?lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数l尾以A表示QUnicode版本函数l尾以W表示。Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE

7. 如何表示Unicode字符串常量?
字符?实例
ANSI "string"
Unicode L"string"
ANSI/Unicode T("string")或_TEXT("string")if( szError[0] == _TEXT('J') ){}

8. Z么应当尽量用操作系l函敎ͼ
q将有助于稍E提高应用程序的q行性能Q因为操作系l字W串函数常常被大型应用程序比如操作系l的外壳q程Explorer.exe所使用。由于这些函C用得很多Q因此,在应用程序运行时Q它们可能已l被装入RAM?br>如:StrCatQStrChrQStrCmp和StrCpy{?

9. 如何~写W合ANSI和Unicode的应用程序?
(1) 文本串视ؓ字符数组Q而不是chars数组或字节数l?br>(2) 通用数据cd(如TCHAR和PTSTR)用于文本字符和字W串?br>(3) 显式数据类?如BYTE和PBYTE)用于字节、字节指针和数据~存?br>(4) TEXT宏用于原义字W和字符丌Ӏ?br>(5) 执行全局性替?例如用PTSTR替换PSTR)?br>(6) 修改字符串运问题。例如函数通常希望在字W中传递一个缓存的大小Q而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传?sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要ؓ字符串分配一个内存块Qƈ且拥有该字符串中的字W数目,那么误住要按字节来分配内存。这是_应该调用
malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)?

10. 如何对字W串q行有选择的比较?
通过调用CompareString来实现?br>标志 含义
NORM_IGNORECASE 忽略字母的大写
NORM_IGNOREKANATYPE 不区分^假名与片假名字符
NORM_IGNORENONSPACE 忽略无间隔字W?br>NORM_IGNORESYMBOLS 忽略W号
NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字W?br>SORT_STRINGSORT 标点符号作为普通符h处理

11. 如何判断一个文本文件是ANSIq是UnicodeQ?br>判断如果文本文g的开头两个字节是0xFF?xFEQ那么就是UnicodeQ否则是ANSI?

12. 如何判断一D字W串是ANSIq是UnicodeQ?br>用IsTextUnicodeq行判断。IsTextUnicode使用一pdl计Ҏ和定性方法,以便猜测~存的内宏V由于这不是一U确切的U学ҎQ因?IsTextUnicode有可能返回不正确的结果?

13. 如何在Unicode与ANSI之间转换字符Ԍ
Windows函数MultiByteToWideChar用于多字节字符串{换成宽字W串Q函数WideCharToMultiByte宽字符串{换成{h的多字节字符丌Ӏ?/p>

醒目西西 2010-03-06 00:59 发表评论
]]>
.net中对象序列化技术浅谈[转]http://www.shnenglu.com/xingmuxixi/archive/2010/02/02/107028.html醒目西西醒目西西Tue, 02 Feb 2010 10:01:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2010/02/02/107028.htmlhttp://www.shnenglu.com/xingmuxixi/comments/107028.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2010/02/02/107028.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/107028.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/107028.html序列化是对象状态{换ؓ可保持或传输的格式的q程。与序列化相对的是反序列化,它将{换ؓ对象。这两个q程l合hQ可以轻村֜存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客L和服务器之间传输该对象。反之,反序列化Ҏ重新构造对象。此外还可以对象序列化后保存到本地Q再ơ运行的时候可以从本地文g?#8220;恢复”对象到序列化之前的状态?br>?net中有提供了几U序列化的方式:
二进制序列化
XML序列?br>SOAP序列?/p>

二进制序列化
所谓二q制序列化,指的是对象序列化之后是二q制形式的。二q制序列化是通过BinaryFormattercL实现的,q个cM于System.Runtime.Serialization.Formatters.Binary命名I间下?/p>

XML序列?br>所谓XML序列化,是指对象序列化之后的l果是XML形式的。保存XML序列化是通过XmlSerializer cL实现的, q个cM于System.Xml.Serialization命名I间下?/p>

SOAP序列?br>所谓SOAP序列化是指对象序列化之后的结果符合SOAP协议Q也是可以通过SOAP协议传输Q不知道SOAP协议Q百度一下吧Q。SOAP序列化是通过SoapFormattercL实现的,q个cM于System.Runtime.Serialization.Formatters.Soap命名I间下,q且需要注意需要手动添加对q个命名I间的引用,如下图所C:
 

下面~写一个类用于序列化和反序列化Q这个类的代码如下:

using System;  
using System.Collections.Generic;  
using System.Text;  
 
namespace MySerializeDemo  
{  
    [Serializable]  
    /// <summary>  
    /// 要序列化的对?nbsp; 
    /// 作者:周公  
    /// ~写旉Q?009-03-10  
    /// </summary>  
    public class MyObject  
    {  
        //[NonSerialized]  
        private string name;  
        private DateTime birthday;  
        private string homePlace;  
        /// <summary>  
        /// 出生?nbsp; 
        /// </summary>  
        public string HomePlace  
        {  
            get { return homePlace; }  
            set { homePlace = value; }  
        }  
   
        /// <summary>  
        /// 生日  
        /// </summary>  
        public DateTime Birthday  
        {  
            get { return birthday; }  
            set { birthday = value; }  
        }  
   
        /// <summary>  
        /// 姓名  
        /// </summary>  
        public string Name  
        {  
            get { return name; }  
            set { name = value; }  
        }  
   
        /// <summary>  
        /// q龄  
        /// </summary>  
        public int Age  
        {  
            get { return DateTime.Now.Year - birthday.Year; }  
        }  
        /// <summary>  
        /// override了ToString()Ҏ  
        /// </summary>  
        /// <returns></returns>  
        public override string ToString()  
        {  
            return string.Format("姓名Q{0},生日Q{1},出生圎ͼ{2},q龄Q{3}",name,birthday,homePlace,Age);  
        }  
   
    }  

using System;
using System.Collections.Generic;
using System.Text;

namespace MySerializeDemo
{
    [Serializable]
    /// <summary>
    /// 要序列化的对?br>    /// 作者:周公
    /// ~写旉Q?009-03-10
    /// </summary>
    public class MyObject
    {
        //[NonSerialized]
        private string name;
        private DateTime birthday;
        private string homePlace;
        /// <summary>
        /// 出生?br>        /// </summary>
        public string HomePlace
        {
            get { return homePlace; }
            set { homePlace = value; }
        }
 
        /// <summary>
        /// 生日
        /// </summary>
        public DateTime Birthday
        {
            get { return birthday; }
            set { birthday = value; }
        }
 
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
 
        /// <summary>
        /// q龄
        /// </summary>
        public int Age
        {
            get { return DateTime.Now.Year - birthday.Year; }
        }
        /// <summary>
        /// override了ToString()Ҏ
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format("姓名Q{0},生日Q{1},出生圎ͼ{2},q龄Q{3}",name,birthday,homePlace,Age);
        }
 
    }
}
下面是分别用上面的三个类q行序列化和反序列化的代码:

view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.IO;  
using System.Runtime.Serialization.Formatters;  
using System.Runtime.Serialization.Formatters.Binary;  
using System.Runtime.Serialization.Formatters.Soap;  
using System.Xml.Serialization;  
 
namespace MySerializeDemo  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            MyObject obj = new MyObject();  
            obj.Birthday = new DateTime(1979, 11, 7);  
            obj.HomePlace = "湖北";  
            obj.Name = "周公";  
            Console.WriteLine("========使用BinaryFormatterc进行序列化和反序列化?===");  
            BinarySerialize(obj);  
            BinaryDeserialize("C:\\MyObject.dat");  
            Console.WriteLine("========使用SoapFormatterc进行序列化和反序列化?===");  
            SOAPSerialize(obj);  
            SOAPDeserialize("C:\\MyObject.soap");  
            Console.WriteLine("========使用XmlSerializerc进行序列化和反序列化?===");  
            XMLSerialize(obj);  
            XMLDeserialize("C:\\MyObject.xml");  
        }  
        /// <summary>  
        /// 二进制序列化对象  
        /// </summary>  
        /// <param name="obj"></param>  
        public static void BinarySerialize(MyObject obj)  
        {  
            using (FileStream stream = new FileStream("C:\\MyObject.dat", FileMode.Create, FileAccess.Write))  
            {  
                BinaryFormatter formater = new BinaryFormatter();  
                formater.Serialize(stream, obj);  
                Console.WriteLine("对象已经被序列化? + obj.ToString());  
            }  
        }  
        /// <summary>  
        /// 二进制反序列?nbsp; 
        /// </summary>  
        /// <param name="fileName"></param>  
        public static void BinaryDeserialize(string fileName)  
        {  
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))  
            {  
                BinaryFormatter formater = new BinaryFormatter();  
                MyObject obj=(MyObject)formater.Deserialize(stream);  
                Console.WriteLine("对象已经被反序列化? + obj.ToString());  
            }  
        }  
 
        /// <summary>  
        /// 二进制序列化对象  
        /// </summary>  
        /// <param name="obj"></param>  
        public static void SOAPSerialize(MyObject obj)  
        {  
            using (FileStream stream = new FileStream("C:\\MyObject.soap", FileMode.Create, FileAccess.Write))  
            {  
                SoapFormatter formater = new SoapFormatter();  
                formater.Serialize(stream, obj);  
                Console.WriteLine("对象已经被序列化? + obj.ToString());  
            }  
        }  
        /// <summary>  
        /// 二进制反序列?nbsp; 
        /// </summary>  
        /// <param name="fileName"></param>  
        public static void SOAPDeserialize(string fileName)  
        {  
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))  
            {  
                SoapFormatter formater = new SoapFormatter();  
                MyObject obj = (MyObject)formater.Deserialize(stream);  
                Console.WriteLine("对象已经被反序列化? + obj.ToString());  
            }  
        }  
        /// <summary>  
        /// XML序列?nbsp; 
        /// </summary>  
        /// <param name="obj"></param>  
        public static void XMLSerialize(MyObject obj)  
        {  
            using (FileStream stream = new FileStream("C:\\MyObject.xml", FileMode.Create, FileAccess.Write))  
            {  
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));  
                serializer.Serialize(stream, obj);  
                Console.WriteLine("对象已经被序列化? + obj.ToString());  
            }  
        }  
        /// <summary>  
        /// XML反序列化  
        /// </summary>  
        /// <param name="fileName"></param>  
        public static void XMLDeserialize(string fileName)  
        {  
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))  
            {  
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));  
                MyObject obj = (MyObject)serializer.Deserialize(stream);  
                Console.WriteLine("对象已经被反序列化? + obj.ToString());  
            }  
        }  
    }  

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Xml.Serialization;

namespace MySerializeDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            MyObject obj = new MyObject();
            obj.Birthday = new DateTime(1979, 11, 7);
            obj.HomePlace = "湖北";
            obj.Name = "周公";
            Console.WriteLine("========使用BinaryFormatterc进行序列化和反序列化?===");
            BinarySerialize(obj);
            BinaryDeserialize("C:\\MyObject.dat");
            Console.WriteLine("========使用SoapFormatterc进行序列化和反序列化?===");
            SOAPSerialize(obj);
            SOAPDeserialize("C:\\MyObject.soap");
            Console.WriteLine("========使用XmlSerializerc进行序列化和反序列化?===");
            XMLSerialize(obj);
            XMLDeserialize("C:\\MyObject.xml");
        }
        /// <summary>
        /// 二进制序列化对象
        /// </summary>
        /// <param name="obj"></param>
        public static void BinarySerialize(MyObject obj)
        {
            using (FileStream stream = new FileStream("C:\\MyObject.dat", FileMode.Create, FileAccess.Write))
            {
                BinaryFormatter formater = new BinaryFormatter();
                formater.Serialize(stream, obj);
                Console.WriteLine("对象已经被序列化? + obj.ToString());
            }
        }
        /// <summary>
        /// 二进制反序列?br>        /// </summary>
        /// <param name="fileName"></param>
        public static void BinaryDeserialize(string fileName)
        {
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                BinaryFormatter formater = new BinaryFormatter();
                MyObject obj=(MyObject)formater.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化? + obj.ToString());
            }
        }

        /// <summary>
        /// 二进制序列化对象
        /// </summary>
        /// <param name="obj"></param>
        public static void SOAPSerialize(MyObject obj)
        {
            using (FileStream stream = new FileStream("C:\\MyObject.soap", FileMode.Create, FileAccess.Write))
            {
                SoapFormatter formater = new SoapFormatter();
                formater.Serialize(stream, obj);
                Console.WriteLine("对象已经被序列化? + obj.ToString());
            }
        }
        /// <summary>
        /// 二进制反序列?br>        /// </summary>
        /// <param name="fileName"></param>
        public static void SOAPDeserialize(string fileName)
        {
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                SoapFormatter formater = new SoapFormatter();
                MyObject obj = (MyObject)formater.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化? + obj.ToString());
            }
        }
        /// <summary>
        /// XML序列?br>        /// </summary>
        /// <param name="obj"></param>
        public static void XMLSerialize(MyObject obj)
        {
            using (FileStream stream = new FileStream("C:\\MyObject.xml", FileMode.Create, FileAccess.Write))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
                serializer.Serialize(stream, obj);
                Console.WriteLine("对象已经被序列化? + obj.ToString());
            }
        }
        /// <summary>
        /// XML反序列化
        /// </summary>
        /// <param name="fileName"></param>
        public static void XMLDeserialize(string fileName)
        {
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
                MyObject obj = (MyObject)serializer.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化? + obj.ToString());
            }
        }
    }
}
q个E序的运行效果如下:
 
可见通过上面三个c都能实现将对象序列化保存,q且都能反序列化q原到对象被序列化之前的状态(q正是序列化意义所在,能保存对象运行时的状态ƈ且还能还原)。如果运行上面的代码会在C盘根目录下创Z个文Ӟ分别是MyObject.dat、MyObject.soap和MyObject.xml文gQ因为MyObject.dat是二q制文gQ所以无法查看文件的内容Q但是我们可以打开MyObject.soap和MyObject.xmlq两个文件来比较一下有什么区别?br>MyObject.soap文g的后~虽然?soapQ但是还是可以用C本打开的,下面是MyObject.soap文g的内容:
view plaincopy to clipboardprint?
<SOAP-ENV:Envelope xmlns:xsi="<birthday>1979-11-07T00:00:00.0000000+08:00</birthday> 
<homePlace id="ref-4">湖北</homePlace> 
</a1:MyObject> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
<SOAP-ENV:Envelope xmlns:xsi="
<birthday>1979-11-07T00:00:00.0000000+08:00</birthday>
<homePlace id="ref-4">湖北</homePlace>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
MyObject.xml文g也可以用C本打开Q它的内容如下:

view plaincopy to clipboardprint?
<?xml version="1.0"?> 
<MyObject xmlns:xsi="
<MyObject xmlns:xsi="

醒目西西 2010-02-02 18:01 发表评论
]]>
C# winform 实现(不规?H体或者控件的拖动http://www.shnenglu.com/xingmuxixi/archive/2010/01/27/106510.html醒目西西醒目西西Wed, 27 Jan 2010 02:30:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2010/01/27/106510.htmlhttp://www.shnenglu.com/xingmuxixi/comments/106510.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2010/01/27/106510.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/106510.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/106510.htmlҎ一: H体或者控件的拖动

   private Point m_MousePoint;
private Point m_LastPoint;

  protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
this.m_LastPoint = this.Location;
this.m_MousePoint = this.PointToScreen(e.Location);
}


protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button == MouseButtons.Left)
{
Point t = this.PointToScreen(e.Location);
Point l = this.m_LastPoint;

        l.Offset(t.X - this.m_MousePoint.X, t.Y - this.m_MousePoint.Y);
this.Location = l;
}
}

1 代码直接复制到窗体上可以?

2 可以用到UserControl?UserControl成了一个可拖动的控件了

3 可以用到自定义控件上,例如:自定义控件承了一个Button ,然后写上上面代码,那么q个自定义Button可以在FormH体上随处拖?...

 Ҏ? 不规则窗体拖?/p>

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;

public void ShapedForm_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}


Ҏ?比较?,能够d 虚线?跟Windows的窗体拖动一?..........



醒目西西 2010-01-27 10:30 发表评论
]]>
servlet中调用EJBhttp://www.shnenglu.com/xingmuxixi/archive/2010/01/14/105669.html醒目西西醒目西西Thu, 14 Jan 2010 09:00:00 GMThttp://www.shnenglu.com/xingmuxixi/archive/2010/01/14/105669.htmlhttp://www.shnenglu.com/xingmuxixi/comments/105669.htmlhttp://www.shnenglu.com/xingmuxixi/archive/2010/01/14/105669.html#Feedback0http://www.shnenglu.com/xingmuxixi/comments/commentRss/105669.htmlhttp://www.shnenglu.com/xingmuxixi/services/trackbacks/105669.html阅读全文

醒目西西 2010-01-14 17:00 发表评论
]]>
պ޹ۺϾþþ| ƷŷþþӰ| ƷۺϾþþþþ97| þþƷƷapp| Ӱһþþþó˾Ʒۺ | LƷþ| 99þùѸ| þsmȤ| Ʒݾþþþ| 㽶99þùۺϾƷլ | ŷ޾ƷþþavӰ | ۺϾþøϾþúݺݺ97ɫ| һɫۺþ| þܳ| 91Ʒþþþþ| ˾þþƷӰԺ| þ91ƷۺϹҳ| þ99Ʒþþþþö̬ͼ| þþƵ| Ůaaaþþü| 69þҹɫƷ69| þþƷƷ޾Ʒ | ƷŮþþþþ2018| ޾Ʒþþþþ| 91þùƵ| þþ޹| ھƷþþþӰԺձ | avպƷþþþþa| պݺݾþ͵͵ɫۺ0| 99þþƷѹۿ| ƷþþþþĻ| þþŮ붯ȺëƬ| ޾Ʒþþþsm| þþSS鶹ŷպ| ƷۺϾþ| þŮcc98cm| þþƷһWWW| 99þɫĻ| þݺҹҹ2014| þˬˬƬAV鷳| 뾫Ʒþһ|