知道电动机皮带参数能算出最大皮带盘尺寸吗

C# 使用多线程如何传递两个以上参数的实现方法(附示例)
C# 使用多线程如何传递两个以上参数的实现方法(附示例)
  某些情况下当我们启动一个线程的时候会向该线程传递参数,有时除了功能上需要之外,我觉得还有就是为了我们能管理好启动的线程组(当然,只开一两个线程什么的也谈不上不好管理了,我说的线程组是指10+的线程,我们很难去主动控制的)。
  因为刚接触C#,所以还没有在C#下用过多线程去实现某些功能。通过学习我发现单纯的去启动线程很容易,反而是想要往线程中传一些参数变得有点说道了,这里我想说传入参数的数量为&=2。不过我们还是一步一步的来,带大家过一遍C#下的多线程怎么搞。
  以上一篇讲的网络通信的例子,把整个过程走一遍。这里网络通信只是作为一个讲解的示例,依旧是在控制台(Console)程序下实现的。
  当Server端想要能与多个Client端进行连通的话,就必须用到多线程机制,我的思路:当程序启动后,Server端自己开一个专门用于进行监听的线程,这样主程序如果想做其他事也就不耽误了。当监听线程检测到有连接的请求,就为这个IP单独创建一个新的Socket(我们暂时称为SA Socket)进行通信用,当然,这个SA通信的内容(比如:收发消息)就是在一个新的线程或者两个(我们暂时称为TA线程)里实现的了,这个时候就需要我们往TA线程里传入SA的专有ID,让TA线程只专门为SA服务。之后的就依次类推了。
  下面创建一个监听线程,这也是一个C#下最简单的多线程使用&&创建多线程
  Thread&ListenThread&=&new&Thread(new&ThreadStart(ServerListener));& &  ListenThread.Start();&
  对,就是这么easy,Thread构造函数里的参数类型为ThreadStart,这个东西官方解释是一个委托(啊,这里就不讲委托了,好像是C#特有的吧?反正我理解就是一个函数指针类型的东西或者是说某函数的别名,至于如何关联方法与委托,就是用new 委托名(函数名)的方法),表示此线程开始执行时要调用的方法。
  关于委托大家可以下载这个PPT,第229页处有详细讲解,简单易懂。
  如上所说,在监听线程里我会创建一个监听的socket,然后有连接的话,会返回一个新的Socket对象,看代码:
  //用于连接通道的socket,我默认创建了5个,也就是说与Server端最多只能连通5个socket&   Socket[]&CommunicationSocket&=&new&Socket[5];& &  //index来维护所创建的socket数组&   int&index&=&0;& &  &省略&& &  //如有Client进行连接,返回一个新的socket&   CommunicationSocket[index]&=&ListenSocket.Accept();&
  接下来就是本篇的关键部分了,由于我已经创建好了一个用于通信的CommunicationSocket,所以现在需要去创建一个独立的线程,用于专门为这个新的Socket作通信使用,而我传入的参数就是CommunicationSocket这个对象以及这个对象在socket数组中的位置index。  &
  既然new ThreadStart()只能传入一个方法名,而没有给我们传参数的地方,那么针对于这个情况,我们需要用点小技巧,那就是使用类,看代码:
  //消息操作类,用于传入线程&   publicclass&MessageHandler& &  {& &  &&&&&Socket&socket&=&& &  int&index&=&0;& &  bool&StopFlag&=&& &  public&MessageHandler(Socket&socket,&int&index)& &  &&&&&{& &  this.socket&=&& &  this.index&=&& &  &&&&&&&&Console.WriteLine(&线程&&+&this.index&+&&号被创建!&);& &  &&&&&}& &  //接收线程调用的函数&   publicvoid&ReceiveMessage()& &  &&&&{& &  byte[]&buffer&=&newbyte[1024*4];& &  string&message&=&& &  try  &&&&&&&&{& &  while&(!StopFlag)& &  &&&&&&&&&&&&{& &  int&result&=&this.socket.Receive(buffer,&0,&buffer.Length,&SocketFlags.None);& &  if&(result&&&0)& &  &&&&&&&&&&&&&&&&{& &  & &  &&&&&&&&&&&&&&&&}& &  &&&&&&&&&&&&&&&&message&=&System.Text.Encoding.UTF8.GetString(buffer);& &  &&&&&&&&&&&&&&&&Console.Write(&Client(&&+&DateTime.Now.ToShortTimeString()&+&&):&&+&message.Trim());& &  &&&&&&&&&&&&&&&&Console.WriteLine();&&&&&&& &  &&&&&&&&&&&&}& &  &&&&&&&&&}& &  catch&(System.Exception&ex)& &  &&&&&&&&&&{& &  &&&&&&&&&&&&&&Console.WriteLine(ex.ToString());this.socket.Close();& &  &&&&&&&&&&}& &  &&&&}& &  //发送线程调用的函数&   publicvoid&SendMessage()& &  &&&&{& &  byte[]&buffer&=&newbyte[1024&*&4];& &  string&message&=&& &  try  &&&&&&&&{& &  while&(!StopFlag)& &  &&&&&&&&&&&&{& &  &&&&&&&&&&&&&&&&message&=&Console.ReadLine();& &  if&(message.ToLower().Equals(&byebye&))& &  &&&&&&&&&&&&&&&&{& &  &&&&&&&&&&&&&&&&&&&&StopFlag&=&& &  &&&&&&&&&&&&&&&&}& &  &&&&&&&&&&&&&&&&buffer&=&System.Text.Encoding.UTF8.GetBytes(message);& &  this.socket.Send(buffer);&&&&&&& &  &&&&&&&&&&&&&}& &  &&&&&&&&&}& &  catch&(System.Exception&ex)& &  &&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&& &  &&&&&&&&&&&&Console.WriteLine(ex.ToString());this.socket.Close();& &  &&&&&&&&&}& &  &&&&}& &  }&
  这是我自己定义的消息操作类,大家看看,这个类的里面即实现了利用socket发送消息,也实现了接收消息的方法。写到这大家有没有来点灵感呢?再继续往下看:
  //如果出现新的socket通道,那么分别创建一个该通道的接收线程与发送线程&   //创建&MessageHandler类的对象,同时将参数传入到该对象中去,该实例的方法用于作为线程的目标方法&   MessageHandler&MsgHandler&=&new&MessageHandler(CommunicationSocket[index],&index);& &  ReceiveThread[index]&=&new&Thread(new&ThreadStart(MsgHandler.ReceiveMessage));& &  ReceiveThread[index].Start();& &  SendThread[index]&=&new&Thread(new&ThreadStart(MsgHandler.SendMessage));& &  SendThread[index].Start();& &  index++;&
  这样就实现了往线程里传递1个以上的参数了。
  这里主要就是展示一下如何去传多个参数,对于多线程的管理等细节上还是有很多漏洞的,所以大家挑干的来就好了。
  另外我附上原码,跟文章中的有点出路,主要是在文章中我对一些变量名称稍加进行了修改,便于大家看代码。
  最后要说的是在C#多线程中传递一个参数的时候,有另外的专门方法,记得也是跟委托有关,不过具体我只是当时看了一下,这会儿已经记不得了,感兴趣的朋友可以去搜一下,不过话说回来,既然都会传多个参数了,传一个参数的话应该也很好搞定的。
  希望能帮到有需要的人。
  博客链接:
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 197, 距离下一级还需 3 积分
论坛徽章:0
例如void threadfunc(voie *p, int i);
beginthreadex(...)的参数该怎么写?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 166, 距离下一级还需 34 积分
论坛徽章:0
白手起家, 积分 197, 距离下一级还需 3 积分
论坛徽章:0
小富即安, 积分 2203, 距离下一级还需 2797 积分
论坛徽章:0
原帖由 csoapy 于
10:50 发表
struct满足不了你的需求吗
白手起家, 积分 18, 距离下一级还需 182 积分
论坛徽章:0
结构,常用可能也是唯一的方法
白手起家, 积分 15, 距离下一级还需 185 积分
论坛徽章:0
别的方法可能就是动态参数了,不过我不清楚线程的方式是否支持!不过推荐也是比较好的方式是使用struct方式了。
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处如何向线程传递参数
我的图书馆
如何向线程传递参数
=new ThreadStart(Calculate);Thread thread=new Thread(threadStart);thread.Start(); public void Calculate()
{&&& double Diameter=<SPAN style="COLOR: #.5;&&&& Console.Write("The Area Of Circle with a Diameter of {0} is&&&&& {1}"Diameter,Diameter*Math.PI);}
上面我们用定义了一个ThreadStart类型的委托,这个委托制定了线程需要执行的方法:Calculate,在这个方法里计算了一个直径为0.5的圆的面积,并输出.这就构成了最简单的多线程的例子,在很多情况下这就够用了,然后ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数,这显然是个很大的不足,为了弥补这个缺陷,聪明的程序员想出了许多好的方法,我们将在需要传递多个参数一节中进行介绍,这里我们先介绍.Net为了解决这个问题而设定的另外一个委托:就是ParameterizedThreadStart ,我会在下面详细讲述
需要传递单个参数
ParameterThreadStart的定义为void ParameterizedThreadStart(object state)??使用这个这个委托定义的线程的启动函数可以接受一个输入参数,具体例子如下ParameterizedThreadStart threadStart=new ParameterizedThreadStart(Calculate)Thread thread=new Thread()thread.Start(<SPAN style="COLOR: #.9); //需要注意的是,这里的变量必须为 object类型,如果需要传递接口(如arcEngine开发时候使用接口为参数),也需要先转换为object,在使用时,在转换回去public void Calculate(object arg)
{&& double Diameter=double(arg);&& Console.Write("The Area Of Circle with a Diameter of {0} is&&{1}"Diameter,Diameter*Math.PI);}
Calculate方法有一个为object类型的参数,虽然只有一个参数,而且还是object类型的,使用的时候尚需要类型转换,但是好在可以有参数了,并且通过把多个参数组合到一个类中,然后把这个类的实例作为参数传递,就可以实现多个参数传递。
而对于比较推荐的
/// &summary&
/// Summary description for clsThreadFun.
/// &/summary&
public class clsThreadFun
private string strUserN
public string UserName
get{ return strUserN}
set{ strUserName = value; }
public clsThreadFun( string sUserName)
// TODO: Add constructor logic here
strUserName = sUserN
/// &summary&
/// Thread interface function
/// &/summary&
public void ThreadFun()
//Detail thread handle
clsThreadFun myThreadFun = new clsThreadFun( "Test" );
//Set parameter through
Thread myThread = new Thread( new ThreadStart( myThreadFun.ThreadFun ) );
myThread.Start();
发表评论:
TA的推荐TA的最新馆藏启动带参数的线程
启动带参数的线程
发布时间: 3:03:09
编辑:www.fx114.net
本篇文章主要介绍了"启动带参数的线程 ",主要涉及到启动带参数的线程 方面的内容,对于启动带参数的线程 感兴趣的同学可以参考一下。
前个星期,公司的项目在客户那里出现了点问题,情况为电话打入后,系统不能弹单(打入电话的时候会显示打入电话者的三字段信息:名字、电话、地址),经过检查后,发现为系统在向GIS系统发送数据的时候造成一个超时等待(GIS没有启动,但是我不明白的是我用的UdpClient,按理说不应该出现这种情况啊),考虑后,决定使用线程来解决这个问题,但是这个线程需要以带参数的形式启动,经过思考后,得出以下代码:// 首先要写一个类,类里头包含了数据的发送,以构造函数的方式将REMOTE HOST、PORT、和要发送的数据构造进去。#region send gis data&class SendGISData&{&&private string strIP = "";&&private string strData = "";&&private int nRemotePort = -1;
& // IP:目标机IP地址,Data:要发送的字符串数据,RemotePort:端口&&public SendGISData(string IP,string Data,int RemotePort)&&{&&&strIP = IP;&&&strData = D&&&nRemotePort = RemoteP&&}
&&public void UDPSendData()&&{&&&int sendCount = 0;&&&System.Net.Sockets.UdpClient client = new System.Net.Sockets.UdpClient(strIP,nRemotePort);&&&byte[] data = new byte[strIP.Length];&&&try&&&{&&&&client.Connect(strIP,nRemotePort);&&&&data = Encoding.ASCII.GetBytes(strData);&&&&sendCount = client.Send(data,data.Length);&&&}&&&catch&&&{&&&&sendCount = -32767;&&&}&&&finally&&&{&&&&client.Close();&&&}&&}&}&#endregion// 使用方法using System.T............SendGISData GISCtrl= new SendGISData("10.54.163.164","",8080);ThreadStart&threadStart = new ThreadStart(GISCtrl.UDPSendData);Thread thread= new Thread(threadStart);thread.Start();
本文标题:
本页链接:

我要回帖

更多关于 jvm最大允许尺寸参数 的文章

 

随机推荐