CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

问个关于线程的 问题 顶者有分 (2)

楼主wanyeye(助人者天助)2006-10-27 13:14:19 在 .NET技术 / C# 提问

public   void   run()  
                  {  
                          startServer   =   new   Thread(new   ThreadStart(startUdpServer));  
                                      startServer.Start();  
                  }  
   
          private   void   button7_Click(object   sender,   EventArgs   e)  
                  {  
                          run();  
                  }  
  startUdpServer函数内容如下:  
                                  int   i,   j;  
                                  byte[]   receive   =   new   byte[1200];  
                                  byte[]   realdata   =   new   byte[256];  
                                  ASCIIEncoding   s   =   new   ASCIIEncoding();  
   
                                  udp.Connect("192.168.7.69",   1969);  
                                  IPEndPoint   ipadr   =   new   IPEndPoint(IPAddress.Parse("192.168.7.69"),   10001);  
                                  receive   =   udp.Receive(ref   ipadr);  
                                  if   (receive.Length   >   119)  
                                  {  
                                          for   (i   =   0;   i   <   (int)(receive.Length   /   120);   i++)  
                                          {  
                                                  st   =   "";  
                                                  for   (j   =   0;   j   <   29;   j++)  
                                                  {  
                                                          Array.Resize(ref   realdata,   29);  
                                                          realdata[j]   =   receive[i   *   120   +   0x4d   +   j];  
                                                  }  
                                                  st   +=   s.GetString(realdata);  
   
                                          }  
                                          ListViewItem   item;  
                                          string   str   =   textBox1.Text;  
                                          ddd   =   1;  
                                          if   (listView1.Items.Count   <   1)//   如果   listview上的记录为空   则添加一个记录;  
                                          {  
                                                  item   =   new   ListViewItem(ddd.ToString());  
                                                  item.SubItems.Add(st);  
                                                  item.SubItems.Add("1");  
                                                  listView1.Items.Add(item);  
                                                  int   aaa   =   listView1.Items.Count;  
                                          }  
                                          else                            
                                          {  
                                                  for   (int   m   =   0;   m   <   listView1.Items.Count;   m++)        
                                                  {  
                                                          if   (st   ==   Convert.ToString(listView1.Items[m].SubItems[1].Text))  
                                                          {  
                                                             
                                                                  //如果 新的内容 str,和 listview上的记录行 相同 则做  
                                                                  ttt   =   m;  
                                                                  kkk   =   kkk   +   1;  
                                                          }  
                                                          else       //如果     listview   上   tag     列的内容和   str   不相等  
                                                          {  
                                                                  kkk   =   0;  
                                                          }  
                                                  }  
   
                                                  if   (kkk   ==   0)             //如果没有相同的记录则做如下操作,添加新的一条记录;  
                                                  {  
                                                          ddd   =   ddd   +   1;  
                                                          item   =   new   ListViewItem(ddd.ToString());  
                                                          item.SubItems.Add(st);  
                                                          item.SubItems.Add("1");  
                                                          listView1.Items.Add(item);  
                                                  }  
                                                  else         //若记录相等   则给listview   上的   times   列   的加“1”;  
                                                  {  
                                                          listView1.Items[ttt].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                                                  }  
                                          }  
                                  }  
   
                          }  
   
  问题出现在startUdpServer函数   因为listview   这个控件吧  
   
  Cross-thread   operation   not   valid:   control'listview'   accessed   from   a   thead  
  other   than   thread   it   was   create   on.  
   
  还是这个问题   顶的有分       愁死我了  
  问题点数:100、回复次数:57Top

1 楼wanyeye(助人者天助)回复于 2006-10-27 13:15:31 得分 0

TO   LIUJIA  
   
  没写错啊       其实显示的有三列内容     ID     TAG     TIMES  
   
  "subItems[2]"   是次数啊,     意思是:   如果读到卡和每一行的卡号比较  
    比较后确定相同   "subItems[2]"   上就加"1"   次  
   
  不同   就另起一行的  
   
  item   =   new   ListViewItem(ddd.ToString());  
   
  这个也是一列  
  下面是   初始代码  
   
        int   ttt;  
                  int   kkk;  
                  int   ddd;  
    listView1.View   =   View.Details;  
                          //   Add   a   column   with   width   20   and   left   alignment.  
                          listView1.Columns.Add("ID",   30,   HorizontalAlignment.Left);  
                          listView1.Columns.Add("Tag",   120,   HorizontalAlignment.Left);  
                          listView1.Columns.Add("Times",   50,   HorizontalAlignment.Left);  
                          listView1.Columns.Add("Memo",   50,   HorizontalAlignment.Left);  
   
  Top

2 楼bjgzxx(食人一族)回复于 2006-10-27 13:17:12 得分 1

顶Top

3 楼bjgzxx(食人一族)回复于 2006-10-27 13:17:45 得分 1

看着有点乱Top

4 楼tjvictor(终于升星了,向两星奋斗)回复于 2006-10-27 13:21:46 得分 1

問題很明顯,應把listview放在線程外面定義Top

5 楼flowersea312()回复于 2006-10-27 13:22:00 得分 1

帮顶了Top

6 楼Knight94(愚翁)回复于 2006-10-27 13:22:50 得分 0

是你的在线程中操作UI部分,这是不允许的,需要用Invoke或者begininvoke来操作。  
  参看  
  http://blog.csdn.net/Knight94/archive/2006/08/24/1111267.aspxTop

7 楼Knight94(愚翁)回复于 2006-10-27 13:26:27 得分 3

大致的思路就是定义一个委托,然后在线程中用Invoke去处理  
  public   delegate   void   SetItemValue(   string   ItemText   );  
  private   void   SetItem(   string   ItemText)  
  {  
            yourListView.Items[0].Text   =   ItemText;  
  }  
   
  //in   your   thread   function  
  SetItemValue   mySet   =   new   SetItemValue(   SetItem   );  
  this.Invoke(   mySet,   new   object[]{   "test"   }   );Top

8 楼ji_vicky(vicky)回复于 2006-10-27 13:43:52 得分 1

太多了,看不完Top

9 楼zlkingdom(风之悲伤)回复于 2006-10-27 13:50:23 得分 1

的确应该是保证线程安全的规则问题Top

10 楼liujia_0421(SnowLover)回复于 2006-10-27 14:20:52 得分 0

大致帮你改了一下,写得有点复杂:  
  两个委托:  
  public   delegate   void   MyInvoke1(int   id);//用于对相同的项增加次数  
  public   delegate   void   MyInvoke2(int   id,string   st);//用于增加新的项  
   
  两个函数:  
   
  private   void   CreateNewItem(int   id,   string   st)  
                  {  
                          //添加一个新的项  
                          ListViewItem   item   =   new   ListViewItem(id.ToString());  
                          item.SubItems.Add(st);  
                          item.SubItems.Add("1");  
                          listView1.Items.Add(item);  
                          int   aaa   =   listView1.Items.Count;                        
                  }  
  private   void   UpdateItemTimes(int   id)  
                  {  
                          //将出现相同的项次数增1  
                          listView1.Items[id].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                  }  
   
  你的代码:  
  if   (receive.Length   >   119)  
                          {  
                                  for   (i   =   0;   i   <   (int)(receive.Length   /   120);   i++)  
                                  {  
                                          st   =   "";  
                                          for   (j   =   0;   j   <   29;   j++)  
                                          {  
                                                  Array.Resize(ref   realdata,   29);  
                                                  realdata[j]   =   receive[i   *   120   +   0x4d   +   j];  
                                          }  
                                          st   +=   s.GetString(realdata);  
   
                                  }  
   
                                  ListViewItem   item;  
                                  string   str   =   textBox1.Text;  
                                  ddd   =   1;  
                                  if   (listView1.Items.Count   <   1)//   如果   listview上的记录为空   则添加一个记录;  
                                  {  
                                            //改的地方1  
                                          //item   =   new   ListViewItem(ddd.ToString());  
                                          //item.SubItems.Add(st);  
                                          //item.SubItems.Add("1");  
                                          //listView1.Items.Add(item);  
                                          //int   aaa   =   listView1.Items.Count;  
                                          MyInvoke2   mi   =   new   MyInvoke2(CreateNewItem);  
                                          this.BeginInvoke(mi,   new   object[]   {   ddd,   st   });  
                                  }  
                                  else  
                                  {  
                                          for   (int   m   =   0;   m   <   listView1.Items.Count;   m++)  
                                          {  
                                                  if   (st   ==   Convert.ToString(listView1.Items[m].SubItems[1].Text))  
                                                  {  
   
                                                          //如果 新的内容 str,和 listview上的记录行 相同 则做  
                                                          ttt   =   m;  
                                                          kkk   =   kkk   +   1;  
                                                  }  
                                                  else       //如果     listview   上   tag     列的内容和   str   不相等  
                                                  {  
                                                          kkk   =   0;  
                                                  }  
                                          }  
   
                                          if   (kkk   ==   0)             //如果没有相同的记录则做如下操作,添加新的一条记录;  
                                          {  
                                                  ddd   =   ddd   +   1;  
                                                  //改的地方2  
                                                  //item   =   new   ListViewItem(ddd.ToString());  
                                                  //item.SubItems.Add(st);  
                                                  //item.SubItems.Add("1");  
                                                  //listView1.Items.Add(item);  
                                                  MyInvoke2   mi   =   new   MyInvoke2(CreateNewItem);  
                                                  this.BeginInvoke(mi,   new   object[]   {   ddd,   st   });  
                                          }  
                                          else         //若记录相等   则给listview   上的   times   列   的加“1”;  
                                          {  
                                                  //改的地方3  
                                                  //listView1.Items[ttt].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                                                  MyInvoke1   mi   =   new   MyInvoke1(UpdateItemTimes);  
                                                  this.BeginInvoke(mi,   new   object[]   {ttt});  
                                          }  
                                  }  
                          }  
   
  共有三处改的地方。楼主根据需要可以再自行修改一下,我没有测试,楼主自己试一下吧。  
   
   
  Top

11 楼liujia_0421(SnowLover)回复于 2006-10-27 14:22:34 得分 0

楼主再自己分析一下,对你来说应该不难。Top

12 楼wanyeye(助人者天助)回复于 2006-10-27 14:58:20 得分 0

谢谢各位  
   
  这个最后应该在   Microsoft   BizTalk2006   里出现地  
  界面是不用的     我只是想自己测试   DLL   这个RFID中间件是否真确  
  我去掉listview   看断点   看的结果了   可能还有点问题  
   
  请大家多指教     刚接触C#   也是公司临时安排的   没办法   麻烦各位了  
   
  Top

13 楼liujia_0421(SnowLover)回复于 2006-10-27 15:13:20 得分 0

单步调试一下,多试几次,如果还有问题再放上来,大家一同讨论一下,共同学习。Top

14 楼Awavese(Awavese)回复于 2006-10-27 15:17:47 得分 1

UPTop

15 楼wanyeye(助人者天助)回复于 2006-10-27 15:28:45 得分 0

TO  
  liujia_0421()    
  今天没时间了   换办公室要   搬楼下   呵呵  
   
  周一来试试再     基本的协议   都封装差不多了   如果没问题的话   下月去MS   再做进一步开发  
  再次谢谢各位的帮助  
  Top

16 楼skywolfma(蓝色愿望沙)回复于 2006-10-27 15:37:45 得分 1

……最常见的线程问题,在UI线程外操作UI线程创建的控件  
  用委托来做吧Top

17 楼hdhmail2000(禅剑飞雪)回复于 2006-10-27 16:26:25 得分 1

upTop

18 楼GXY2005(民工甲:杀富济贫,打土豪分田地)回复于 2006-10-27 16:35:51 得分 1

听Knight94(愚翁)的没错!Top

19 楼wanyeye(助人者天助)回复于 2006-10-27 16:44:19 得分 0

 
  namespace   WindowsApplication1  
  {  
          public   partial   class   Form1   :   Form  
          {  
                  int   ttt;  
                  int   kkk;  
                  int   ddd;  
                  ListViewItem   item;  
                   
                  Thread   startServer;  
              //     int   i;  
                  public   Form1()  
                  {  
                          InitializeComponent();  
   
                          listView1.View   =   View.Details;  
                          //   Add   a   column   with   width   20   and   left   alignment.  
                          listView1.Columns.Add("ID",   30,   HorizontalAlignment.Left);  
                          listView1.Columns.Add("Tag",   120,   HorizontalAlignment.Left);  
                          listView1.Columns.Add("Times",   50,   HorizontalAlignment.Left);  
                          listView1.Columns.Add("Memo",   50,   HorizontalAlignment.Left);  
                  }  
   
                  private   void   button1_Click(object   sender,   EventArgs   e)  
                  {  
                        while   (true)  
                          {  
                                  run();  
                          }  
                                               
                  }  
                  public   void   run()  
                  {  
                          startServer   =   new   Thread(new   ThreadStart(startUdpServer));  
                         
                          startServer.Start();  
                  }  
                  public   void   startUdpServer()  
                  {  
                          try  
                          {  
                                                                       
                                          string   st   =   "aaaa";  
                                          ddd   =   1;                                      
                                          if   (listView1.Items.Count   <   1)//   如果   listview上的记录为空   则添加一个记录;  
                                          {  
                                                  item   =   new   ListViewItem(ddd.ToString());  
                                                  item.SubItems.Add(st);  
                                                  item.SubItems.Add("1");  
                                                  listView1.Items.Add(item);  
                                                  int   aaa   =   listView1.Items.Count;  
                                          }  
                                          else                            
                                          {  
                                                  for   (int   m   =   0;   m   <   listView1.Items.Count;   m++)        
                                                  {  
                                                          if   (st   ==   Convert.ToString(listView1.Items[m].SubItems[1].Text))  
                                                          {  
                                                                  //如果 新的内容 str,和 listview上的记录行 相同 则做  
                                                                  ttt   =   m;  
                                                                  kkk   =   kkk   +   1;  
                                                          }  
                                                          else       //如果     listview   上   tag     列的内容和   str   不相等  
                                                          {  
                                                                  kkk   =   0;  
                                                          }  
                                                  }  
   
                                                  if   (kkk   ==   0)             //如果没有相同的记录则做如下操作,添加新的一条记录;  
                                                  {  
                                                          ddd   =   ddd   +   1;  
                                                          item   =   new   ListViewItem(ddd.ToString());  
                                                          item.SubItems.Add(st);  
                                                          item.SubItems.Add("1");  
                                                          listView1.Items.Add(item);  
                                                  }  
                                                  else         //若记录相等   则给listview   上的   times   列   的加“1”;  
                                                  {  
                                                          listView1.Items[ttt].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                                                  }  
                                          }  
                                  //   }  
   
                          }  
                          catch   (Exception   error)  
                          {  
                                  MessageBox.Show(error.Message);  
                          }  
                  }  
          }  
  }  
   
  我把真实的卡号去掉了,   ST="aaaa"     用这个做为卡号  
  那位哥们   喝茶时间帮搞下     不是我懒   实在是摸不到门道  
   
   
  Top

20 楼papper(小齐)回复于 2006-10-27 16:44:51 得分 1

帮LZ顶,  
  PS:愚翁确实有蛮吊哦!也顺便顶他一下  
  最后接分,哈哈Top

21 楼gui0605(名花虽有主,锄头更无情,只要锄头舞的好,哪有墙角挖不倒!)回复于 2006-10-27 16:48:01 得分 1

太多了~没看哦。接分Top

22 楼mademelaugh(五朝臣子(以接分为荣,以不结帖为耻))回复于 2006-10-27 16:51:10 得分 1

接分正当时。Top

23 楼liujia_0421(SnowLover)回复于 2006-10-27 16:53:53 得分 0

to:   我把真实的卡号去掉了,   ST="aaaa"     用这个做为卡号  
  没大明白,能否说得再详细点...Top

24 楼purexiafeng(下风)回复于 2006-10-27 16:54:05 得分 1

接分Top

25 楼twozerozerosix(sureSuccess)回复于 2006-10-27 16:55:59 得分 1

http://www.eimhe.com/bbs/adget.php?id=379765  
   
  美河学习在线——专业视频课程下载基地  
  Top

26 楼jimmy_L()回复于 2006-10-27 17:08:11 得分 1

接分Top

27 楼hcl8260(学习的小猪)回复于 2006-10-27 17:10:33 得分 1

ding  
  Top

28 楼zg_soso()回复于 2006-10-27 17:24:06 得分 1

ding   jfTop

29 楼myminimouse(坚决不用baidu)回复于 2006-10-27 17:24:15 得分 1

接分  
  Top

30 楼free_wang()回复于 2006-10-27 17:36:40 得分 1

upTop

31 楼shaozy()回复于 2006-10-27 17:37:40 得分 1

的确,你应该把listview放到线程外,用一个线程专门完成对控件的修改,别的线程想更改控件的要向这个线程发消息.Top

32 楼CHCXHW(CHC)回复于 2006-10-27 17:44:46 得分 1

照着他们的做把   很简单的   试试就OKTop

33 楼liujia_0421(SnowLover)回复于 2006-10-27 17:50:43 得分 0

to:   我把真实的卡号去掉了,   ST="aaaa"     用这个做为卡号  
  没大明白,能否说得再详细点...Top

34 楼glitdoor()回复于 2006-10-27 17:55:00 得分 1

ddTop

35 楼xjjdanran(何流)回复于 2006-10-27 23:00:28 得分 1

UPTop

36 楼sportlife5200(不会游泳的鲨鱼)回复于 2006-10-27 23:22:24 得分 1

代码真多,没看完,不过给你提个思路  
   
  在一个线程中操作另一个线程一般来说是不允许的,可以使用基于事件的异步后台线程来处理数据,在事件中向调用线程(有控件的线程)报告处理结果等各种需要报告的东西,MSDN有详细讲解,可以在本地MSDN中搜索“基于事件的异步模式组件”,它手把手教你如何建立、使用Top

37 楼sportlife5200(不会游泳的鲨鱼)回复于 2006-10-27 23:25:06 得分 1

使用基于事件的异步模式进行多线程编程  
  ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxadvance/html/958d6617-5e70-4b36-b5db-63c16dc35e43.htm  
   
  在IE中输入以上网址,就出来了Top

38 楼leeyeefeng2004(leeyeefeng)回复于 2006-10-27 23:29:18 得分 1

1。触发事件  
  2。只有脱离线程,才能控制你的listview  
      methodXXXX   mk   =new   methodXXX(委托方法名)  
        this.invoke(委托方法名)  
  具体的忘记了,单词不会。。。呵呵Top

39 楼pshy(无心)回复于 2006-10-28 02:57:47 得分 1

頂........Top

40 楼yitian130(※爱计算机胜过爱自己!‰为理想而战)回复于 2006-10-28 05:58:47 得分 1

顶Top

41 楼free_wang()回复于 2006-10-28 11:00:08 得分 1

顶Top

42 楼seemwind(zhamanxia)回复于 2006-10-28 14:24:17 得分 1

那么长,看的好累Top

43 楼xinxin85()回复于 2006-10-28 16:44:23 得分 1

有分么   我顶下Top

44 楼apple_tang()回复于 2006-10-28 18:48:32 得分 1

就是就是,没前没后的,看得累人Top

45 楼free_wang()回复于 2006-10-29 14:19:54 得分 1

upTop

46 楼jhkemail(我在我的梦里梦到你在我的梦里梦到我在你的梦里梦到你在我的梦里梦到我)回复于 2006-10-29 14:22:42 得分 1

这是一个网吧管理系统。  
  首先在SQL里用getdate()得到当前登陆时间,然后以预存金额与所定义的时段收费(时段收费是在另一张表中,有二十四个字段,从零到二十三,里面记录了每个小时的收费标准)进行减运算,逐一相减,比如20块,现在时间为晚上八点,那么就是20-八点收费标准-九点收费标准以此类推,直到小于或等于1,然后用余数与下一个时段收费标准进行相除,得出所能上网的时长,精确到分,然后与当前登陆时间进行相加,然后得出预计下机时间。  
  第一个做出来的送分一百,只能在SQL里完成,不能使用其它代码,当然如果有JAVA代码或者C#代码作参考,会补送一些补偿分。请高手帮忙!    
   
  顶顺便说一下我的问题,贴子在C#专区。。。。一百分,在线等。。。Top

47 楼wanyeye(助人者天助)回复于 2006-10-30 12:11:52 得分 0

to:liujia  
   
    我把真实的卡号去掉了,   ST="aaaa"     用这个做为卡号  
  没大明白,能否说得再详细点...  
   
  因为你没真实的设备   读不到卡   ,ST="aaaa"   这个算虚拟的卡号  
  如过你把代码建立个简单的工程   就可以在listview上看   aaaa   这个虚拟卡号不断增加  
  不用真实的去连接设备读卡了  
  Top

48 楼wanyeye(助人者天助)回复于 2006-10-30 13:54:10 得分 0

CheckForIllegalCrossThreadCalls   =   false;            
   
  加这个在构造函数里  
    private   void   button7_Click(object   sender,   EventArgs   e)  
                  {  
                          run();  
                  }  
   
  run()   这样写能显示   一次  
   
  但   这样写  
    private   void   button7_Click(object   sender,   EventArgs   e)  
                  {    
                        while  
                    {  
                          run();  
                      }  
                  }  
   
  就啥也没有了Top

49 楼liujia_0421(SnowLover)回复于 2006-10-30 13:54:29 得分 0

测试程序如下:  
  using   System;  
  using   System.Collections.Generic;  
  using   System.ComponentModel;  
  using   System.Data;  
  using   System.Drawing;  
  using   System.Text;  
  using   System.Windows.Forms;  
  using   System.Threading;  
   
  namespace   TestListView  
  {  
          public   partial   class   TestListView   :   Form  
          {  
                  private   Thread   startServer;  
                  public   delegate   void   MyInvoke1(int   id);//用于对相同的项增加次数  
                  public   delegate   void   MyInvoke2(int   id,   string   st);//用于增加新的项  
                  int   ttt;  
                  int   kkk;  
                  int   ddd;  
                  string   subItemText;  
                   
   
                  private   void   CreateNewItem(int   id,   string   st)  
                  {  
                          //添加一个新的项  
                          ListViewItem   item   =   new   ListViewItem(id.ToString());  
                          item.SubItems.Add(st);  
                          item.SubItems.Add("1");  
                          listView1.Items.Add(item);  
                          int   aaa   =   listView1.Items.Count;  
                  }  
   
                  private   void   UpdateItemTimes(int   id)  
                  {  
                          //将出现相同的项次数增1  
                          listView1.Items[id].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                  }  
   
                  private   void     GetSubItemText(int   index)  
                  {  
                          //得到子项的值  
                          subItemText=Convert.ToString(listView1.Items[index].SubItems[1].Text);  
                  }  
   
   
                  public   TestListView()  
                  {  
                          InitializeComponent();  
                          ttt=0;  
                          kkk=0;  
                          ddd=1;  
                  }  
   
                  public   void   run()  
                  {  
                          startServer   =   new   Thread(new   ThreadStart(startUdpServer));  
                          startServer.Start();  
                  }  
   
                  private   void   btnTest_Click(object   sender,   EventArgs   e)  
                  {  
                          run();  
                  }  
                  private   void   startUdpServer()  
                  {  
                          for   (int   iii   =   0;   iii   <   10;   iii++)  
                          {  
                                  //ListViewItem   item;  
                                  //string   str   =   textBox1.Text;  
                                  string   st   =   "aaaa";  
                                  //ddd   =   1;  
   
                                  if   (listView1.Items.Count   <   1)//   如果   listview上的记录为空   则添加一个记录;  
                                  {  
                                          //改的地方1  
                                          //item   =   new   ListViewItem(ddd.ToString());  
                                          //item.SubItems.Add(st);  
                                          //item.SubItems.Add("1");  
                                          //listView1.Items.Add(item);  
                                          //int   aaa   =   listView1.Items.Count;  
                                          MyInvoke2   mi   =   new   MyInvoke2(CreateNewItem);  
                                          this.BeginInvoke(mi,   new   object[]   {   ddd,   st   });  
                                  }  
                                  else  
                                  {  
                                          for   (int   m   =   0;   m   <   listView1.Items.Count;   m++)  
                                          {  
                                                  MyInvoke1   mi   =   new   MyInvoke1(GetSubItemText);  
                                                  //string   str   =   Convert.ToString   (   );  
                                                  this.BeginInvoke(mi,   new   object[]   {   m   });  
                                                  if   (st   ==   subItemText   )  
                                                  {  
   
                                                          //如果 新的内容 str,和 listview上的记录行 相同 则做  
                                                          ttt   =   m;  
                                                          kkk   =   kkk   +   1;  
                                                  }  
                                                  else       //如果     listview   上   tag     列的内容和   str   不相等  
                                                  {  
                                                          kkk   =   0;  
                                                  }  
                                          }  
   
                                          if   (kkk   ==   0)             //如果没有相同的记录则做如下操作,添加新的一条记录;  
                                          {  
                                                  ddd   =   ddd   +   1;  
                                                  //改的地方2  
                                                  //item   =   new   ListViewItem(ddd.ToString());  
                                                  //item.SubItems.Add(st);  
                                                  //item.SubItems.Add("1");  
                                                  //listView1.Items.Add(item);  
                                                  MyInvoke2   mi   =   new   MyInvoke2(CreateNewItem);  
                                                  this.BeginInvoke(mi,   new   object[]   {   ddd,   st   });  
                                          }  
                                          else         //若记录相等   则给listview   上的   times   列   的加“1”;  
                                          {  
                                                  //改的地方3  
                                                  //listView1.Items[ttt].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                                                  MyInvoke1   mi   =   new   MyInvoke1(UpdateItemTimes);  
                                                  this.BeginInvoke(mi,   new   object[]   {   ttt   });  
                                          }  
                                  }  
                          }  
   
                  }  
   
          }  
  }  
   
  输出为:  
  ID   Tag   Times  Memo  
  1   aaaa                 10  
   
  Top

50 楼liujia_0421(SnowLover)回复于 2006-10-30 13:59:46 得分 0

稍微修改一下:  
  将string   st   =   "aaaa";修改为:  
  string   st   =   "aaaa"+iii.ToString   ();  
   
  即:  
  using   System;  
  using   System.Collections.Generic;  
  using   System.ComponentModel;  
  using   System.Data;  
  using   System.Drawing;  
  using   System.Text;  
  using   System.Windows.Forms;  
  using   System.Threading;  
   
  namespace   TestListView  
  {  
          public   partial   class   TestListView   :   Form  
          {  
                  private   Thread   startServer;  
                  public   delegate   void   MyInvoke1(int   id);//用于对相同的项增加次数  
                  public   delegate   void   MyInvoke2(int   id,   string   st);//用于增加新的项  
                  int   ttt;  
                  int   kkk;  
                  int   ddd;  
                  string   subItemText;  
                   
   
                  private   void   CreateNewItem(int   id,   string   st)  
                  {  
                          //添加一个新的项  
                          ListViewItem   item   =   new   ListViewItem(id.ToString());  
                          item.SubItems.Add(st);  
                          item.SubItems.Add("1");  
                          listView1.Items.Add(item);  
                          int   aaa   =   listView1.Items.Count;  
                  }  
   
                  private   void   UpdateItemTimes(int   id)  
                  {  
                          //将出现相同的项次数增1  
                          listView1.Items[id].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                  }  
   
                  private   void     GetSubItemText(int   index)  
                  {  
                          //得到子项的值  
                          subItemText=Convert.ToString(listView1.Items[index].SubItems[1].Text);  
                  }  
   
   
                  public   TestListView()  
                  {  
                          InitializeComponent();  
                          ttt=0;  
                          kkk=0;  
                          ddd=1;  
                  }  
   
                  public   void   run()  
                  {  
                          startServer   =   new   Thread(new   ThreadStart(startUdpServer));  
                          startServer.Start();  
                  }  
   
                  private   void   btnTest_Click(object   sender,   EventArgs   e)  
                  {  
                          run();  
                  }  
                  private   void   startUdpServer()  
                  {  
                          for   (int   iii   =   0;   iii   <   10;   iii++)  
                          {  
                                  //ListViewItem   item;  
                                  //string   str   =   textBox1.Text;  
                                  string   st   =   "aaaa"+iii.ToString   ();  
                                  //ddd   =   1;  
   
                                  if   (listView1.Items.Count   <   1)//   如果   listview上的记录为空   则添加一个记录;  
                                  {  
                                          //改的地方1  
                                          //item   =   new   ListViewItem(ddd.ToString());  
                                          //item.SubItems.Add(st);  
                                          //item.SubItems.Add("1");  
                                          //listView1.Items.Add(item);  
                                          //int   aaa   =   listView1.Items.Count;  
                                          MyInvoke2   mi   =   new   MyInvoke2(CreateNewItem);  
                                          this.BeginInvoke(mi,   new   object[]   {   ddd,   st   });  
                                  }  
                                  else  
                                  {  
                                          for   (int   m   =   0;   m   <   listView1.Items.Count;   m++)  
                                          {  
                                                  MyInvoke1   mi   =   new   MyInvoke1(GetSubItemText);  
                                                  //string   str   =   Convert.ToString   (   );  
                                                  this.BeginInvoke(mi,   new   object[]   {   m   });  
                                                  if   (st   ==   subItemText   )  
                                                  {  
   
                                                          //如果 新的内容 str,和 listview上的记录行 相同 则做  
                                                          ttt   =   m;  
                                                          kkk   =   kkk   +   1;  
                                                  }  
                                                  else       //如果     listview   上   tag     列的内容和   str   不相等  
                                                  {  
                                                          kkk   =   0;  
                                                  }  
                                          }  
   
                                          if   (kkk   ==   0)             //如果没有相同的记录则做如下操作,添加新的一条记录;  
                                          {  
                                                  ddd   =   ddd   +   1;  
                                                  //改的地方2  
                                                  //item   =   new   ListViewItem(ddd.ToString());  
                                                  //item.SubItems.Add(st);  
                                                  //item.SubItems.Add("1");  
                                                  //listView1.Items.Add(item);  
                                                  MyInvoke2   mi   =   new   MyInvoke2(CreateNewItem);  
                                                  this.BeginInvoke(mi,   new   object[]   {   ddd,   st   });  
                                          }  
                                          else         //若记录相等   则给listview   上的   times   列   的加“1”;  
                                          {  
                                                  //改的地方3  
                                                  //listView1.Items[ttt].SubItems[2].Text   =   Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text)   +   1));  
                                                  MyInvoke1   mi   =   new   MyInvoke1(UpdateItemTimes);  
                                                  this.BeginInvoke(mi,   new   object[]   {   ttt   });  
                                          }  
                                  }  
                          }  
   
                  }  
   
          }  
  }  
   
  输出如下:  
  ID   Tag   Times   Memo  
  1      aaaa0             1  
  2      aaaa1             1  
  3      aaaa2             1  
  4      aaaa3             1  
  5      aaaa4             1  
  6      aaaa5             1  
  7      aaaa6             1  
  8      aaaa7             1  
  9      aaaa8             1  
  10   aaaa9             1Top

51 楼liujia_0421(SnowLover)回复于 2006-10-30 14:00:55 得分 0

不知是否是楼主说的意思....Top

52 楼wanyeye(助人者天助)回复于 2006-10-30 14:20:02 得分 0

输出为:  
  ID   Tag   Times  Memo  
  1   aaaa                 10  
   
  我要的是这种     谢谢你兄弟  
   
  留个MSN   吧     我觉得以后这个BizTalk2006   这个RFID中间件    
  开发中还会有不少问题,希望能多指教Top

53 楼wanyeye(助人者天助)回复于 2006-10-30 14:47:46 得分 0

TO   LIUJIA  
   
  输出为:  
  ID   Tag   Times  Memo  
  1   aaaa                 10  
   
  你的输出为这个结果的   代码中       startUdpServer()在这个函数里用了   10次的循环啊  
   
  输出的效果是对的,但方法不是想要的  
  我想的是把下面的BUTTON里代码  
   
   
        private   void   btnTest_Click(object   sender,   EventArgs   e)  
                  {  
                          run();  
                  }  
   
  改为  
      private   void   btnTest_Click(object   sender,   EventArgs   e)  
                  {  
                    while(ture)  
                    {  
                        run();  
                      }  
                  }  
  让这个startUdpServer()的线程一直运行     能成么?  
   
  我改了   但程序死了Top

54 楼liujia_0421(SnowLover)回复于 2006-10-30 15:15:14 得分 62

private   void   btnTest_Click(object   sender,   EventArgs   e)  
                  {  
                    while(ture)  
                    {  
                        run();  
                      }  
                  }  
  让这个startUdpServer()的线程一直运行     能成么?  
   
   
  这是死循环,程序当然会死掉啊....Top

55 楼wanyeye(助人者天助)回复于 2006-10-30 16:06:27 得分 0

噢   了解  
  那和MCU程序不一样啊  
   
  while(ture)  
                    {  
                        run();  
                      }  
   
  就是这样个大循环的啊   程序一直工作  
   
  那C#   有什么办法让这个线程   一直工作   或   间隔100ms工作一次?Top

56 楼awen177(abiao)回复于 2006-10-30 16:44:11 得分 0

设置个timer试试Top

57 楼wanyeye(助人者天助)回复于 2006-10-30 16:51:26 得分 0

谢谢你   AWEN    
   
      TIMER   的我试过了是可以的   呵呵   可以定时刷新的  
  同时也不存在   这个问题   就是交叉线程  
   
      按MS专家的意思   一定要用线程  
  不行去北京再说了Top

相关问题

关键词

得分解答快速导航

  • 帖主:wanyeye
  • bjgzxx
  • bjgzxx
  • tjvictor
  • flowersea312
  • Knight94
  • ji_vicky
  • zlkingdom
  • Awavese
  • skywolfma
  • hdhmail2000
  • GXY2005
  • papper
  • gui0605
  • mademelaugh
  • purexiafeng
  • twozerozerosix
  • jimmy_L
  • hcl8260
  • zg_soso
  • myminimouse
  • free_wang
  • shaozy
  • CHCXHW
  • glitdoor
  • xjjdanran
  • sportlife5200
  • sportlife5200
  • leeyeefeng2004