在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现“线程间操作无效: 从不是创建控件的线程访问它”异常。
        为什么.net不让我们跨线程操作控件,这是有好处的。因为如果你的线程多了,那么当两个线程同时尝试将一个控件变为自己需要的状态时,线程的死锁就会发生。但是难道就是因为这个原因,我们就只能让程序卡着么?当然不是,这里教大家一个解决方案:用BackGroundWorker
        这里通过一个实例来告诉大家BackGroundWorker的用法。
        首先我们先定义一个BackGroundWorker,大家可以去面板上拖一个,也可以自己手工定义一个。
this.backgroundWorker_Combo = new System.ComponentModel.BackgroundWorker();//定义一个backGroundWorker
this.backgroundWorker_Combo.WorkerSupportsCancellation = true;//设置能否取消任务
  this.backgroundWorker_Combo.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_Combo_DoWork);//让backgroundWorker做的事
this.backgroundWorker_Combo.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker_Combo_RunWorkerCompleted);//当backgroundWorker做完后发生的事件
        如果是从面板上拖的,那么请在DoWork事件上双击,添加那些你想在背景线程中执行的代码,也就是那些可能会让你卡的代码。
        然后再在RunWorkerCompleted事件上双击,添加那些你想往控件里操作的代码。
        这里有一个开发实例,讲的是实现类似Google搜索中下拉列表的实现。其思路是在DoWork中搜索数据库,在Completed中将搜出来的东西放进去。
        本文需要一个backgroundWorker,一个ComboBox控件
        static char x;
        
/**//// <summary>
        
/// 接受从DLL搜出来的项目
        
/// </summary>

        private string[] global_ListItem;

        
private void backgroundWorker_Combo_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        
{//如果数组中有东西,那么加入ComboBox
            if (global_ListItem.Length>0)
            
{
                
this.comboBox_App.Items.Clear();
                
this.comboBox_App.Items.AddRange(global_ListItem);
            }

        }


        
private void backgroundWorker_Combo_DoWork(object sender, DoWorkEventArgs e)
        
{
            global_ListItem 
= Form_Setting.Global_DBC.SimilarFilter(x); //这是一个DLL中的方法,用于查找所有以X打头的项目,并放入一个数组中
        }


        
private void comboBox_App_TextChanged(object sender, EventArgs e)
        
{//当用户键入一个字母时去数据库查
            ComboBox cb = sender as ComboBox;
            
if (cb.Text.Length==1)
            
{
                x 
= cb.Text[0];
                
this.backgroundWorker_Combo.RunWorkerAsync();
            }

        }
        第二种简单的方法是运用CheckForIllegalCrossThreadCalls,在主窗体的构造函数中加上  Control.CheckForIllegalCrossThreadCalls = false; 即可
posted @ 2008-08-28 17:34 凌点 阅读(11) | 评论 (0)编辑
     摘要: VS2008、C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来。一个最直接的方法便是使用多线程。多线程编程的方式在WinForm开发中必不可少。本文介绍在WinForm开发中如何使用多线程,以及在线程中如何通过Control.Invoke方法返回窗体主线程执行相关操作。-. WinForm多线程编程1. new T... 阅读全文
posted @ 2008-08-27 17:57 凌点 阅读(6) | 评论 (0)编辑
public   class   ListItem
{

        private   string   textField;

        public   string   TextField
        {
                get   {   return   textField;   }
                set   {   textField   =   value;   }
        }

        private   string   valueField;

        public   string   ValueField
        {
                get   {   return   valueField;   }
                set   {   valueField   =   value;   }
        }
}
//下面绑定

    System.Collections.ArrayList   list   =   new   System.Collections.ArrayList();

                for   (int   i   =   0;   i   <   10;   i++)
                {
                        MyListItem   listItem   =   new   MyListItem();
                        listItem.TextField   =   "Text "   +   i;
                        listItem.ValueField   =   i.ToString();      
list.Add(listItem);                  
                }
combobox.DataSource   =   list;
combobox.DisplayMember   =   "TextField ";
combobox.ValueMember   =   "ValueField ";
posted @ 2008-08-27 15:39 凌点 阅读(5) | 评论 (0)编辑
中国个人网站的发展短短5年,迅猛发展,
目前国内已经有近100万的站长,专职的站长超过10万, 网站数量超过300万
特整理了 站长相关的网站,供大家参考 更多的了解个人站长资讯与动态
www.im286.com               落伍者论坛  拥有10多万的会员 站长的发源地
bbs.chinaz.com              站长站 站长的站长 最多的源码程序,站长工具.
www.donews.com              很多个人站长走向商业,走向市场的桥梁
www.techweb.com.cn          国内网站,ceo 小道消息,八卦之发源地
www.csdn.net                程序员 网站开发者资讯论坛中心
www.admin5.com              个人网站站长信息网 赚钱信息 网站制作技巧
www.cnwebmasters.cn         国外网赚 广告论坛 网站赚钱之教父
bbs.51.la                   我要啦站长论坛
bbs.chinageren.com          个人站长站论坛
www.cnzzad.com              站长信息论坛
bbs.web888.org              站长论坛
www.chinahtml.com           站长资讯网 资讯源码信息,论坛  
bbs.jz173.com               建站173论坛
www.myand.com               新视听论坛
www.cnfree.net              空间快手|
www.jgwy.net                金光论坛  最早的免费空间,免费域名论坛
www.discuz.net              Discuz! 官方网站
www.zzadmin.com             中国站长前线
web888.bbs.xilu.com         最早的网站联盟信息发源地
www.gdzz.net                广东站长
www.aqclub.com              站长赚钱联盟
www.chinazhan.net           中国站长
cwf.265.com                 站长大会资讯网
bbs.zwren.com               织网人论坛
www.99admin.com             久久站长站
www.tutu888.com            中国站长资讯网
www.eachnic.com            域名交易网
bbs.dvbbs.net              动网论坛
www.web-site-vc.com        网站投资
bbs.powereasy.ne           动易论坛
bbs.51js.com               无忧脚本
www.internic.net           国际域名查询
whois.webhosting.info      ip绑定域名列表
ewhois.cnnic.cn cn         域名查询
www.alexa.com              查询网站排名
posted @ 2008-08-25 08:44 凌点 阅读(12) | 评论 (0)编辑

.NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。这个命名空间有很多的类。System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类。他有很多的方法,在这里我们将就比较常用和重要的方法做一下介绍:
    Thread.Start():启动线程的执行;

  Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;

  Thread.Resume():继续已挂起的线程;

  Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;

  Thread.Join():阻塞调用线程,直到某个线程终止时为止

  Thread.Sleep():将当前线程阻塞指定的毫秒数;

  Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。
  通过调用Thread.SleepThread.Suspend或者Thread.Join可以暂停/阻塞线程。调用Sleep()Suspend()方法意味着线程将不再得到CPU时间。这两种暂停线程的方法是有区别的,Sleep()使得线程立即停止执行,但是在调用Suspend()方法之前,公共语言运行时必须到达一个安全点。一个线程不能对另外一个线程调用Sleep()方法,但是可以调用Suspend()方法使得另外一个线程暂停执行。对已经挂起的线程调用Thread.Resume()方法会使其继续执行。不管使用多少次Suspend()方法来阻塞一个线程,只需一次调用Resume()方法就可以使得线程继续执行。已经终止的和还没有开始执行的线程都不能使用挂起。Thread.Sleepint x)使线程阻塞x毫秒。只有当该线程是被其他的线程通过调用Thread.Interrupt()或者Thread.Abort()方法,才能被唤醒。如果对处于阻塞状态的线程调用Thread.Interrupt()方法将使线程状态改变,但是会抛出ThreadInterupptedException异常,你可以捕获这个异常并且做出处理,也可以忽略这个异常而让运行时终止线程。在一定的等待时间之内,Thread.Interrupt()和Thread.Abort()都可以立即唤醒一个线程。
    我们可以通过使用Thread.Abort()方法来永久销毁一个线程,而且将抛出ThreadAbortException异常。使终结的线程可以捕获到异常但是很难控制恢复,仅有的办法是调用Thread.ResetAbort()来取消刚才的调用,而且只有当这个异常是由于被调用线程引起的异常。对于A和B两个线程,A线程可以正确的使用Thread.Abort()方法作用于B线程,但是B线程却不能调用Thread.ResetAbort()来取消Thread.Abort()操作。
    Thread.Abort()方法使得系统悄悄的销毁了线程而且不通知用户。一旦实施Thread.Abort()操作,该线程不能被重新启动。调用了这个方法并不是意味着线程立即销毁,因此为了确定线程是否被销毁,我们可以调用Thread.Join()来确定其销毁,Thread.Join()是一个阻塞调用,直到线程的确是终止了才返回。但是有可能一个线程调用Thread.Interrupt()方法来中止另外一个线程,而这个线程正在等待Thread.Join()调用的返回。

   尽可能的不要用Suspend()方法来挂起阻塞线程,因为这样很容易造成死锁。假设你挂起了一个线程,而这个线程的资源是其他线程所需要的,会发生什么后果。因此,我们尽可能的给重要性不同的线程以不同的优先级,用Thread.Priority()方法来代替使用Thread.Suspend()方法。
  Thread类有很多的属性,这些重要的属性是我们多线程编程必须得掌握的。

  Thread.IsAlive属性:获取一个值,该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false

  Thread.Name 属性:获取或设置线程的名称。

  Thread.Priority 属性:获取或设置一个值,该值指示线程的调度优先级。
  Thread.ThreadState 属性:获取一个值,该值包含当前线程的状态。

 

Thread状态
  System.Threading.Thread.ThreadState属性定义了执行时线程的状态。线程从创建到线程终止,它一定处于其中某一个状态。当线程被创建时,它处在Unstarted状态,Thread类的Start() 方法将使线程状态变为Running状态,线程将一直处于这样的状态,除非我们调用了相应的方法使其挂起、阻塞、销毁或者自然终止。如果线程被挂起,它将处于Suspended状态,除非我们调用resume()方法使其重新执行,这时候线程将重新变为Running状态。一旦线程被销毁或者终止,线程处于Stopped状态。处于这个状态的线程将不复存在,正如线程开始启动,线程将不可能回到Unstarted状态。线程还有一个Background状态,它表明线程运行在前台还是后台。在一个确定的时间,线程可能处于多个状态。据例子来说,一个线程被调用了Sleep而处于阻塞,而接着另外一个线程调用Abort方法于这个阻塞的线程,这时候线程将同时处于WaitSleepJoinAbortRequested状态。一旦线程响应转为Sle阻塞或者中止,当销毁时会抛出ThreadAbortException异常。

线程优先级
  System.Threading.Thread.Priority枚举了线程的优先级别,从而决定了线程能够得到多少CPU时间。高优先级的线程通常会比一般优先级的线程得到更多的CPU时间,如果不止一个高优先级的线程,操作系统将在这些线程之间循环分配CPU时间。低优先级的线程得到的CPU时间相对较少,当这里没有高优先级的线程,操作系统将挑选下一个低优先级 的线程执行。一旦低优先级的线程在执行时遇到了高优先级的线程,它将让出CPU给高优先级的线程。新创建的线程优先级为一般优先级,我们可以设置线程的优先级别的值,如下面所示:

  Highest
  AboveNormal
  Normal
  BelowNormal
  Lowest

posted @ 2008-08-20 17:57 凌点 阅读(20) | 评论 (0)编辑

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="User_Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>用户登陆</title>
    <link href="/images/style.css" rel="stylesheet" type="text/css" />
    <script language="javascript">
function CheckForm()
{
if(document.form1.txtUserLoginName.value.length<5)
{
alert("用户名不可少于5个字符");
return false;
}
if(document.form1.txtPassword.value.length<6)
{
alert("密码不可少于6个字符");
return false;
}
}
</script>

</head>
<body >
    <form  runat="server" id="form1" >
    <div>
    <table class="maintable" cellspacing="1" align="center" style=" width:400px">
      <tr>
    <td class="title" colspan="3">■用户登陆</td>
 </tr>
    <tr><td class="left" style="width:100px">用户名:</td><td style="width:100px"> <input  name="txtUserLoginName" type="text" /></td></tr>
    <tr><td class="left">密码:</td><td ><input type="password" name="txtPassword"  /></td></tr>
    <tr><td class="left" style="height: 24px"> </td><td style="height: 24px"> <asp:Button ID="btnSubmit" runat="server" CssClass="button" OnClientClick=" return CheckForm()" OnClick="btnSubmit_Click" Text="登    陆" /></td></tr>
    </table>
       </div>       
    </form>
</body>
</html>

posted @ 2008-08-01 15:39 凌点 阅读(13) | 评论 (0)编辑

有时候,我们要对某字段进行处理后再绑定到gridview 

 

<asp:TemplateField HeaderText="体检类型">                              
                                <ItemTemplate>
                                    <%# GetcardType((string)Eval("standby1"))%>
                                </ItemTemplate>
                            </asp:TemplateField>

 

.cs 函数

       //绑定后半段
        public string GetcardType(string card)
        {
            if(!string.IsNullOrEmpty(card))
           // return card.Substring(0, card.IndexOf("|"));
                return card.Substring((card.IndexOf("|")+1));
            return "未知卡类型";
        }

posted @ 2008-07-28 09:08 凌点 阅读(10) | 评论 (0)编辑

1、右键我的电脑 -> 管理 -> 本地用户和组,给 IUSR_机器名IWAM_机器名 两个用户设置密码,要一样。

2、开始 -> 运行 -> 打cmd,
      然后 cd c:\Inetpub\AdminScripts(我的系统在c盘),
      然后 cscript.exe adsutil.vbs set w3svc/wamuserpass 你的密码,
      然后 cscript.exe adsutil.vbs set w3svc/anonymoususerpass 你的密码

     看一下,行了没有?如果还不行,那么
     cscript.exe synciwam.vbs -v,
     然后iisreset。

posted @ 2008-07-09 17:41 凌点 阅读(24) | 评论 (0)编辑
给C++初学者的50个忠告
  1.把C++当成一门新的语言学习(和C没啥关系!真的。);
  2.看《Thinking In C++》,不要看《C++变成死相》;
  3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;
  4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;
  5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
  6.会用Visual C++,并不说明你会C++;
  7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;
  8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;
  9.看Visual C++的书,是学不了C++语言的;
  10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
  11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
  12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
  13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
  14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
  15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
  16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
  17.C++不仅仅是支持面向对象的程序设计语言;
  18.学习编程最好的方法之一就是阅读源代码;
  19.在任何时刻都不要认为自己手中的书已经足够了;
  20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
  21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
  22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
  23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
  24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
  25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
  26.请看《程序设计实践》,并严格的按照其要求去做;
  27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
  28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;
  29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
  30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;
  31.学习编程的秘诀是:编程,编程,再编程;
  32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;
  33.记住:面向对象技术不只是C++专有的;
  34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
  35.把在书中看到的有意义的例子扩充;
  36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;
  37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
  38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
  39.C++语言和C++的集成开发环境要同时学习和掌握;
  40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
  41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;
  42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);
  43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;
  44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
  45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
  46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
  47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
  48.保存好你写过的所有的程序——那是你最好的积累之一;
  49.请不要做浮躁的人;
  50.请热爱C++!
posted @ 2008-07-08 11:36 凌点 阅读(23) | 评论 (0)编辑
ADO   连接字串一网打尽  
   
  ODBC   DSNLess   Connections:  
   
  MS   Access   ODBC   DSNless   connection  
   
  Driver={Microsoft   Access   Driver   (*.mdb)};Dbq=c:\somepath\dbname.mdb;Uid=Admin;Pwd=pass;  
   
   
  dBase   ODBC   DSNless   connection  
   
  Driver={Microsoft   dBASE   Driver   (*.dbf)};DriverID=277;Dbq=c:\somepath\dbname.dbf;  
   
  Oracle   ODBC   DSNless   connection  
   
  Driver={Microsoft   ODBC   for   Oracle};Server=OracleServer.world;Uid=admin;Pwd=pass;  
   
  MS   SQL   Server   DSNless   connection  
   
  Driver={SQL   Server};Server=servername;Database=dbname;Uid=sa;Pwd=pass;  
   
  MS   Text   Driver   DSNless   connection  
   
  Driver={Microsoft   Text   Driver   (*.txt;   *.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist   Security   Info=False;  
   
  Visual   Foxpro   DSNless   connection  
   
  Driver={Microsoft   Visual   FoxPro   Driver};SourceType=DBC;SourceDB=c:\somepath\dbname.dbc;Exclusive=No;  
   
  MySQL   DSNless   connection  
   
  driver={mysql};   database=yourdatabase;server=yourserver;uid=username;pwd=password;option=16386;  
   
  OLE   DB   Connections:  
   
  MS   Access   OLE   DB   connection    
   
  Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=c:\somepath\dbname.mdb;User   Id=admin;Password=pass;    
   
  Oracle   OLE   DB   connection  
   
  Provider=OraOLEDB.Oracle;Data   Source=dbname;User   Id=admin;Password=pass;  
   
  MS   SQL   Server   OLE   DB   connection  
   
  Provider=SQLOLEDB;Data   Source=machineName;Initial   Catalog=dbname;User   ID=sa;Password=pass;  
   
  MS   SQL   Server   OLE   DB   connection   using   an   IP   address  
   
  Provider=SQLOLEDB;   Data   Source=xx.xx.xx.xx,1433;   Network   Library=DBMSSOCN;   Initial   Catalog=dbname;User   ID=sa;Password=pass;  
   
  MS   Text   Driver   OLE   DB   connection  
   
  "Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=C:\yourpath;Extended   Properties='text;FMT=Delimited'"   
 
posted @ 2008-07-04 08:49 凌点 阅读(31) | 评论 (0)编辑