interlocked[3]乱斗西游21 6怎么过过

[文献翻译]&T34/76&Medium&Tank&&(3)
由Osprey出版社出
版的同名著作翻译而成,错误之处敬请指正。声明:本文中所有图片版权归原书出版商所有,所有汉文字由笔者译出,以供个人学习用,转载请声明出处。
德军的反应——豹式坦克
尽管一开始德国人没有认识到T-34坦
克的潜力,但是它还是影响了德国人的坦克设计工作。虽然1940年德国人遭遇了法国令人生畏的Char
B1bis坦克,但德军的坦克研发并没有改变。可T-34坦克最终让德国人走出了自我满足。T-34坦
克对PzKpfw III式和PzKpfw
IV式坦克的技术优势令德国人抓狂,他们制造出一些仿
制品。在对缴获的样车进行测试之后,德国的工程师们发现他们不能量产T-34上的铝制发动机。而且,制造“劣等斯拉夫人”的坦
克在希特勒的第三帝国是不可接受的。取而代之地,他们进行了一项将耗时两年的新设计工作。直到1943年夏,他们的成果——豹
式坦克才出现在战场上;同时,装甲兵们不得不对现有装备进行升级。
斯大林格勒拖拉机厂(STZ)
生产的T-34与其他工厂的坦克有些不同,其中包括使用连锁倾斜装甲(原文为an
interlocked glacis plate——译注)。这些T-34
型坦克在27厂
安装附加装甲板以应对德国人的新型反坦克炮。意外的是,这些坦克直到1944年6月还在列宁格勒服役。
&&& 图2-11
斯大林格勒拖拉机厂在1941年末
引入的另一种改造是简化了炮塔的制造,在后面只是焊接了一块平板——而不是圆角的——以增加产量。这辆坦克以奥尔忠尼启泽(所谓钢铁人民委员——译注)的名字命名,他是30年代的布尔什维克著名领导人。
工厂里的战斗
苏联红军惊人的损失使得德国人在1941年取得了胜利。在付出了惨重的代
价之后红军终于在莫斯科的近郊挡住了德国人的脚步。工厂的生产重点从改进T-34变成了全力生产。用T-34M替
代T-34的计划取消了,因为这会影响到产量。
1941年7月,一个有关将重点工厂
从苏联的西部转移到乌拉尔山区的计划开始实施——在那里建立一个全新的工业城,以防止工厂落入敌手。
图2-12 一辆T-34
型在1941年
夏天被抛弃在河中。注意观察这辆斯大林格勒工厂生产的坦克:新的驾驶员舱门、连锁倾斜装甲、直契型的炮鼻,切球形的炮塔前部和后部的直平钢板。
1941年8月末,T-34的主要制造工厂哈尔科夫火车头工厂
(KhPZ 183厂)开始疏散到下塔吉尔,工厂在那里重新命名为乌拉尔瓦尔贡
183厂(全称: 斯大林同志命名的乌拉尔火车制造183厂;音译是
伊米尼斯大林-乌拉尔斯基·瓦尔贡斯特洛特尼
183厂)。他们生产的第一辆坦克是在1941年12月20号
出厂的。为了弥补哈尔科夫工厂停产造成的产量下降,高尔基城红色索莫沃(又译克拉斯那亚-索莫沃工厂,全称
日丹诺夫同志命名的红色索莫沃112厂——译注)在1941年7月得到
命令准备生产T-34;第一辆于1941年11月被送到莫斯科前线。原
本生产用以替代T-26坦克的T-50坦克的计划被取消,取而代之的是奥姆斯克174厂
转产T-34的部件。1941年下半年总共制造了1886辆T-34,
主要是斯大林格勒生产的。由于工厂疏散,产量事实上是递降的,第三季度生产了1121辆,第四季度只有765辆。
由于缺乏V-2柴油机,一些坦克只能安装老式的M-17汽油机;由于F-34火
炮产量下降,有些坦克只能安装略短的F-32 76.2mm火炮。
由于红军在1941到1942年的冬天几乎损失殆尽,工厂尽全力增加产
量。莫罗佐夫的T-34设计局,尼赫尼-塔吉尔的T-34指导生产小组
尽可能地简化部件的装配。举例言之,1941年的原版T-34安装的F-34
76.2mm火炮有861个零件,1942年版的就只有614个了。原来极高的制造工艺已经没有了,取而代之的是缩短了一半的生产时间,造价也从1941年的269500卢
布减少到1942年的193000卢布。车身上的很多零件都被简化,一些其他零件如装填手潜望镜干脆不安了。
尽管T-34对德国坦克当时具有很大的优势,但它上面得很多缺陷极大地影响了其战斗力。狭窄的双人炮塔以及没有无线电台是非常大的劣势。这是短期之内无法解决的。其他的
一些问题可以临时对付一下。报告显示,变速箱不够稳定,驾驶员舱门在敌人炮火面前不够结实,侧装甲不足。平滑的履带板很不受欢迎,因为在泥泞的条件下它提
供不了足够的摩擦力,而且在敌人的炮火面前显得极其脆弱;但是和KV坦克相比,T-34更可靠。比如,在第10坦克
师,只有16%的T-34坦克是因为机械问题被抛弃的,但是KV则是44%。
斯大林格勒拖拉机厂直到1942年9月
还在生产坦克,甚至在德国人抵达城市外围时生产也未停止。坦克没喷漆直接从工厂开赴前线。此图摄于1942年8月,
斯大林格勒的市民们向一辆从工厂开赴前线的坦克挥手。打头的坦克是在斯大林格勒相对少见的铸造炮塔坦克,注意到契型的炮鼻,这是斯大林格勒的巴里卡德工厂
标志性产品。
斯大林格勒厂生产的T-34 型
得益于作战经验,在T-34坦克上面进行了一些最先进的改进。侧装甲从40mm提升至45mm。为驾驶员安装了新舱门,车尾部的直角传动舱门换成了圆形的,发动机隔板也简化了。引入了一种新的500mm带华夫纹的铸造履带。进行了这种改造的坦克被命名为T-34
1942型。值得注意的是,苏联红军对坦克的改进并没有稳定的政策,改进时刻进行,产生了很多变型的车辆。一些俄国历史学家将最原始的T-34称为T-34
我们这里则使用1940型;对他们所称的1943型,我们这里称为1942型。
驾驶员席的内部照片。T-34使用非常基本的控制方法。右前侧的两个气瓶是用来在寒冷天气中启动发动机用的。
T-34的生产地点如此之多,导致了众多T-34坦克在细节上有相当大的差别。比如,斯大林格勒厂生产的T-34
1941型所有与侧面车体相连的斜面钢板,炮塔的后板单独安装,而且很大。斯大林格勒厂再生产1942型的时
候并不是所有改装一步到位的,它们之中还有不少带有1941型的特征,比如后传动舱门(也就是方的——译注)。因而本文中称这种中间型为型。斯大林格勒的巴里卡德工厂为T-34生产火炮,他们简化了炮鼻为
契型。斯大林格勒造船厂为坦克生产炮塔,在1942年将冷轧焊接炮塔下前部直接切去做成直面,这也是另外一个斯大林格勒工厂的生产标志。
图2-16 T-34
1942型是1941型的简化,使用新履带,新驾驶舱门以及其他
一些改进。这辆T-34
1942型于1942年夏被击毁。车身上的把手样式是高尔基城的红色索莫
沃工厂的生产标志。
哈尔科夫工厂的冷轧焊接设备在疏散过程中曾一度丢失,所以乌拉尔瓦尔贡的头一批T-34使用纳布托夫斯基设计的铸造炮塔。红色索莫沃工厂生产的铸造炮塔形状略有不同且装甲稍厚——相比
普通的52mm,提升至了60mm。1942年前,许多苏联的坦克工厂橡胶短缺,所以引入了一种新式的钢轮作为代替。这种轮子在战场上不受欢迎,因为在高速行进时轮子与履带产生共振使得乘员不得不忍受噪音,而且把坦克本身的零件都震松了。
图 2-17 德国人使用了有限数量
的T-34。图为党卫军“骷髅”装甲师在1942年9月使用的3辆
中的2辆。前边这辆是T-34
1942型,后边那辆是1941型。
橡胶供应恢复之后,有些坦克的前、后路轮换成了带橡胶圈的,中间的三个仍使用钢轮,即便是只有三个也产生了一些麻烦。到1943年
时,全部的钢轮都从战场上彻底消失了。
苏联红军坦克力量的复苏
新坦克工厂的成立使得红军在1942年
的战役中制造了更多的坦克。红军从1941年6月起进行了相当大规模的改组。1941年7月15号,
机械化集团军的建制撤消——因为他们不剩多少坦克了。这些集团军中的坦克师被改为坦克旅,因为这对于无经验的指挥官而言更加易于指挥。1941年8月,
坦克旅有93辆坦克,这包括2个连的T-34坦克、1个
连得KV坦克(7辆),6个连的轻型坦克——T-26,BT-7和
租借法案坦克(就是英美等国给的——译注),这6个连有64辆。秋季重型坦克的损失和较低的产量使得旅的编制在1941年9月时降到67辆。
新的坦克旅是用来在支持军的行动时做单独使用的。为了支援步兵的行动,阻止了一些独立的坦克作战,使用的主要是租借法案坦克。坦克旅的力量在冬天由于产量的下降始终在递减。1941年12月的正式编制只有46辆坦克,而1942年1月
时降到了27辆。然而很多旅的数量连这个都达不到。但是1942年初产量的提升使得坦克旅实力有所增强。1942年6月
的装备清单规定每个旅有16辆T-34,10辆KV和20辆轻型坦克。
图2-18 T-34
1943型使用一种新型的六角形炮塔,这种炮塔在1942年春天
少量生产。这是一个典型的早期型式,因为没有后来的DT机枪装甲防盾,而且无线电天线还安在侧面。炮塔边上的乌克兰语标语写着
“为了苏维埃乌克兰!”
随着红军的指挥官们越来越得心应手,红军开始逐渐地着手建立大兵团建制。1942年3月,
第一批新的坦克集团军建立了。“集团军”这个词带有误导性,在西方它们实际上称为装甲师。第一个集团军有两个坦克旅和一个机械化步兵旅,共有20辆KV坦克、40辆T-34坦克和40辆轻型坦克。在1942年4月
中旬又扩编为三个坦克旅共150辆坦克。它们首次投入作战是在1942年5月
的哈尔科夫战役中,遭受了重大的损失。显然,红军的指挥员仍然不很熟悉装甲部队的使用,经常把集团军分割为较小的作战单位投入到支援步兵的行动中。5月份损失的坦克数量达到将近1500辆。
哈尔科夫的战役导致了对红军装甲力量的一系列重新评估。坦克旅是一种混杂了T-34、KV和T-60坦克的部队。KV-1重型坦克经常遭遇动力不足,比T-34和T-60坦
克行动要慢,经常拖旅的后腿,因为行动缓慢所以与旅的其他坦克脱节。尽管KV坦克在1941年是一
种“奇迹的装备”,但到1942年时已经不是无敌的了。那个时侯,更有经验的苏联坦克指挥官喜欢更快速更可靠地T-34坦
克,希望不要再生产KV和T-60坦克了。尽管有计划停产所有的轻、重型坦克,但是这将干扰坦克工
业的发展——它们已经提升产量开始满足红军的需求了。作为一种妥协,KV坦克不再在旅里服役,而是单独编成一些独立的坦克团去
支援步兵。车里雅宾斯克的一些KV生产线转产T-34。1942年6月
新的坦克旅成立起来,它有3个连共32辆T-34和1个连共21辆轻型坦克。
改组还没来得及对夏末在沃洛涅日和顿河进行的战役产生什么效果。损失是惊人的,从1942年7月
到9月损失了几乎8000辆坦克。德国的第6集团军推进到斯大林格勒
——国防军在东线推进到的最远位置。
一辆典型的普遍装备的1943年 型T-34。这辆T-34
1943年型有一个六角形炮塔,机枪上带防盾,以及步兵用的扶手。炮塔
侧面的标语写的是“中心合作社捐赠”
由于国防军抵达斯大林格勒和它的重点坦克工厂,工厂着手降低T-34的产量以防城市落到德国人手里。1942年8月,
巨大的坦克格勒综合体在车里雅宾斯克建立起来,他们制造KV-1,并逐渐转产T-34。值得注意的
是,斯大林格勒工厂在1942年9月之前——德国人已经抵达城市外围时——还在生产坦克。有个很著
名的故事:工厂的最后一批坦克冲进街道进行战斗,甚至没来得及喷漆。斯大林格勒拖拉机厂是T-34坦克的主力工厂,它制造了42%的T-34坦
克。斯维尔德洛夫斯克(叶卡捷琳堡)的乌拉马许(Uralmash)坦克工厂以前是制造T-34和KV坦
克底盘和炮塔的,从1942年10月起为了弥补斯大林格勒工厂的减产,开始只负责T-34的
组装工作了。
尽管1942年的主要任务是增加T-34的产量,但是还是有一些改进的设计被引入进来。流产的T-34M计划的一个副产物就是T-34
1943年型使用的六角形炮塔。这种炮塔比先前的要更大更宽敞,前装甲的厚度达70mm,侧面是52mm。带弹量从77发提高到100发。炮塔是整体铸造,顶部滚扎。但是乌拉马许工厂制造的炮塔边缘是圆滑的。一共有2670个这样软边的炮塔制造出来,这些炮塔被安装在车里雅宾斯克的坦克格勒和斯维尔德洛夫斯克的乌拉马许工厂生产出来的坦克上。并不是所有的炮塔都生产成六边形的。高尔基城的红色索莫沃工厂直到1942年末仍生产1942年型的老式炮塔,所以两种炮塔一起用。另外一些改进也被引入到T-34
的设计中来,包括“齐克林”空气过滤器(风隔——译注)和一个全新的5档变速箱以及一些其他的细节。到1942年
夏,为T-34坦克安装了40升的尾部外装油箱,这种油箱有两种设计,成对地安装在车体后部。1943年
初,有设计并安装了一种外部油箱,是在车体侧面固定三个油桶。这些油桶并不直接向发动机供油。乘员使用小的电泵或者手泵往内部供油。
T-34 1943年型
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您所在的位置:&&
游戏地址已经复制,您可以粘贴(Ctrl+V)发送给好友
该游戏已添加到您的3366收藏夹
分享小游戏:
滑动星星打分
类型:|大小:4861K|
语言:英文
小游戏评分:
小游戏人气:
小游戏简介:
这是一款很的拆积木游戏哦,游戏采用3D画面。积木拼接复杂然后由你来把它们拆开。这是一项非常棒的挑战哦。要先拆开你得先仔细查看整个形状然后再考虑从哪一块积木开始拆。不然你是拆不掉的哦。来玩吧!祝你好运。
游戏目标:
把合在一起的积木拆开
如何开始:
游戏加载完成后点击2次“PLAY”,然后选择关卡即可游戏
操作指南:
mouseleft拖动积木
鼠标左键点击移动画面。空格键切换模式后可以移动积木,在按空格键恢复移动画面模式
mouseleft拖动积木
同类小游戏推荐
玩过《3D拆积木》小游戏的用户还玩过
推荐小游戏
精品小游戏推荐4537人阅读
&&&&&&& 在c#里面,实现线程同步方法有很多种。我了解到的至少有8种。这里先讲下,一种比较简单的同步方法-------轻量级同步Interlock。
&&&&&&& 为什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步。如果你学过操作系统里面的PV操作(即信号量),那么你对它已经了解了一般。它实现的正是如同信号量的功能。下面是它提供的方法:
Interlocked.Increment(ref value)
数值加一(原子性操作)
Interlocked.Decrement(ref value)
数值减一(原子性操作)
Interlocked.Exchange(ref value1, value2)
交换:把值2赋给值1;返回新值
pareExchange(ref value1, value2, value3)
实现比较和交换两种功能:值1和值3比较,如果相同,把值2给值1,不相同则不作任何操作;返回原值(多用于判断条件)(示例3中会用到)
&&&&& 下面是它的几个用法示例:
&&&&& (1)示例1:简单输出
int num = 0;
Interlocked.Increment(ref num);
Console.WriteLine(num);
Interlocked.Decrement(ref num);
Console.WriteLine(num);
Interlocked.Exchange(ref num, 10);
Console.WriteLine(num);
Console.pareExchange(ref num, 100, 10));
Console.WriteLine(num);
&&&&&&&&&&
&&&&&&&&&&&& 输出结果如下:
&&&&&&&&&&&
&&&&& (2)示例2:创建1个后台进程和50个前台进程。后台用于每隔一秒通报当期有几个进程在运行。50个前台进程则什么事都不敢,只随机停留1~12秒。代码如下:
&&&&&&using S
using System.Collections.G
using System.L
using System.T
using System.T
namespace InterlockExample
class Program
//记录线程数
private static int threadCount = 0;
private static Random rnd = new Random();
/// &summary&
/// 创建一个线程,什么事也不干, 只随机停留1~12秒
/// &/summary&
private static void RndThreadFunc()
//新建线程,线程数加一
Interlocked.Increment(ref threadCount);
//什么事也不干, 只随机停留1~12秒
int sleepTime = rnd.Next();
Thread.Sleep(sleepTime);
//线程结束,线程数减一
Interlocked.Decrement(ref threadCount);
/// &summary&
/// 每隔一秒,通报有几个线程存在
/// &/summary&
private static void RptThread()
while(true)
int threadNumber = 0;
//获取当前线程数
threadNumber = Interlocked.Exchange(ref threadCount, threadCount);
Console.WriteLine("{0} Thread(s) alive ", threadNumber);
Thread.Sleep(1000);
static void Main(string[] args)
//创建RptThread线程,每隔一秒通报有几个线程存在
Thread reporter = new Thread(new ThreadStart(RptThread));
//设置为后台线程
reporter.IsBackground =
reporter.Start();
//创建50个RndThreadFunc线程
Thread[] rndThreads = new Thread[50];
for (int i = 0; i & 50; i++)
rndThreads[i] = new Thread(new ThreadStart(RndThreadFunc));
rndThreads[i].Start();
&&&&& 结果如下:(答案不唯一,因为线程是随机停留的)
&&&&&& (3)示例3:对写文件的加锁操作。我们知道读一个文件可以允许几个人同时进行,而写操作则每次只允许一人。这里创建5个写的进程,每次只能有一个进程可以写,其他进程必须等待当前写进程退出,才可进入。代码如下:
&&&&&&& using S
using System.Collections.G
using System.L
using System.T
using System.T //线程
using System.IO;
namespace InterlockExample
/// &summary&
/// 一个类似于自旋锁的类,也类似于对共享资源的访问机制
/// 如果资源已被占有,则等待一段时间再尝试访问,如此循环,直到能够获得资源的使用权为止
/// &/summary&
public class SpinLock
//资源状态锁,0--未被占有, 1--已被占有
private int theLock = 0;
//等待时间
private int spinW
public SpinLock(int spinWait)
this.spinWait = spinW
/// &summary&
/// &/summary&
public void Enter()
//如果已被占有,则继续等待
while (pareExchange(ref theLock, 1, 0) == 1)
Thread.Sleep(spinWait);
/// &summary&
/// &/summary&
public void Exit()
//重置资源锁
Interlocked.Exchange(ref theLock, 0);
/// &summary&
/// 自旋锁的管理类
/// &/summary&
public class SpinLockManager : IDisposable
//Disposable接口,实现一种非委托资源回收机制,可看作显示回收资源。任务执行完毕后,会自动调用Dispose()里面的方法。
private SpinLock spinL
public SpinLockManager(SpinLock spinLock)
this.spinLock = spinL
spinLock.Enter();
//任务结束后,执行Dispose()里面的方法
public void Dispose()
spinLock.Exit();
/// &summary&
/// &/summary&
class Program
private static Random rnd = new Random();
//创建资源锁,管理资源的访问
private static SpinLock logLock = new SpinLock(10);
//以写的方式打开文件,选择追加模式
private static StreamWriter fsLog =
new StreamWriter(File.Open("Log.txt",
FileMode.Append,
FileAccess.Write,
FileShare.None));
/// &summary&
/// 写入文件
/// &/summary&
private static void RndThreadFunc()
//创建SpinLockManager,并调用Dispose()方法。这里采用using字段,是调用Dispose()方法的形式。
using (new SpinLockManager(logLock))
//写入文件
fsLog.WriteLine("Thread Starting");
fsLog.Flush();
int time = rnd.Next(10, 200);
Thread.Sleep(time);
using (new SpinLockManager(logLock))
fsLog.WriteLine("Thread Exiting");
fsLog.Flush();
static void Main()
Thread[] rndThreads = new Thread[5];
//创建5个RndThreadFunc的线程
for (int i = 0; i & 5; i++)
rndThreads[i] = new Thread(new ThreadStart(RndThreadFunc));
rndThreads[i].Start();
&&&&&&&& 结果如下:
&&&&&&& (4)示例4:发牌程序。游戏简介:有一个发送线程负责发牌,4个接受线程(可以看做4个玩家)轮流接收牌。这里实现的原理很像信号量的机制。具体说明:
&&&&&&&&1、设有一个发送线程sender,依次产生1-52的数,就好像依次发出52张牌。
2、同时有4个接收线程Receiver在依次接收Sender发出的52张牌
3、每一轮中,发送线程Sender发送4张牌,4个接收线程轮流接收这四张牌。
4、设置发送线程的优先级最高为1,保证接收线程每执行一次,即接收一张牌后,再由发送线程执行一次。
&&&&&&&&& 代码如下(在后面的同步线程浅析中,会分别用到其他同步方法(lock,volatile,Monitor等 )实现这个范例,以此作为讲解。):附录该实例下载地址:
&&&&&&&&&using S
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.T
namespace SendCard
public partial class SendCard : Form
private CardManager cardM
public SendCard()
InitializeComponent();
//该句是允许主线外其他线程操控Winform控件,因为在Winform2.0以后,微软加强了控件访问的安全性,是不允许主线程外的其他线程访问控件的。
//如果不用这句会报错。当然,你也可以采用别的方法屏蔽掉这个错误,例如委托。
Control.CheckForIllegalCrossThreadCalls =
cardManager = new CardManager(10);
/// &summary&
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void btnSendCard_Click(object sender, EventArgs e)
//文本框清零
foreach (Control cnt in this.Controls)
if (cnt is RichTextBox)
((RichTextBox)cnt).Clear();
//创建发牌和接收牌类的实例
Sender sender1 = new Sender(52, cardManager);
//发送52张牌
Receiver[] receiver = new Receiver[4];
//创建线程:1个发牌线程和4个接收牌的线程
Thread[] receiveThread = new Thread[4];
Thread sendThread = new Thread(new ThreadStart(sender1.SendCard));
sendThread.Start();
//4个接收牌线程
for (int i = 0; i & 4; i++)
//依次获取编辑框控件rtbPlayer0~rtbPlayer3
Control[] rtb = this.Controls.Find("rtbPlayer" + i.ToString(), true);
receiver[i] = new Receiver(i, cardManager, (RichTextBox)rtb[0], 13);
receiveThread[i] = new Thread(new ThreadStart(receiver[i].ReceiveCard));
receiveThread[i].Start();
/// &summary&
/// 管理发牌和接受牌的类,类似于信号量的操作。主要有两个信号:1.发牌信号--标记当期是否已发牌 2.接收牌玩家信号---标记轮到哪个玩家接受牌
/// &/summary&
public class CardManager
//标记是否已发牌,0--下一张未发,1--已发
private int hasCard = 0;
//当前接收牌的玩家号:0~3
//当前牌号
//等待时间
private int waitT
public CardManager(int time)
order = 0;
this.waitTime =
/// &summary&
/// &/summary&
/// &param name="value"&牌号&/param&
public void PutFunc(int value)
//已发牌则继续等待,牌给取走,下一次发牌
while (Interlocked.Exchange(ref hasCard, hasCard) == 1)
Thread.Sleep(waitTime);
this.value =
//重置发牌状态:已发
Interlocked.Exchange(ref hasCard, 1);
public int GetFunc(int order)
//等待接收牌,如果牌仍未发放或不是发给该玩家,则继续等待
while (Interlocked.Exchange(ref hasCard, hasCard) == 0 || Interlocked.Exchange(ref this.order, this.order) != order)
Thread.Sleep(waitTime);
//更改为下一个接收牌的玩家序号
Interlocked.Exchange(ref this.order, (order+1)%4);
//重置发牌状态:未发
Interlocked.Exchange(ref hasCard, 0);
/// &summary&
/// 接收牌类
/// &/summary&
public class Receiver
//玩家序号
//牌管理对象
private CardManager carM
//文本编辑框
private RichTextBox rtbP
private int cardS
/// &summary&
/// 接收牌--构造函数
/// &/summary&
/// &param name="order"&玩家序号&/param&
/// &param name="carManager"&牌管理对象&/param&
/// &param name="rtbPlay"&文本编辑框&/param&
/// &param name="cardSum"&要接受的牌数量&/param&
public Receiver(int order, CardManager carManager, RichTextBox rtbPlay, int cardSum)
this.order =
this.carManager = carM
this.rtbPlay = rtbP
this.cardSum = cardS
/// &summary&
/// 接收牌
/// &/summary&
public void ReceiveCard()
for (int i = 0; i & cardS i++)
//添加到文本框
rtbPlay.AppendText(carManager.GetFunc(order) + " ");
Thread.Sleep(100);
/// &summary&
/// &/summary&
public class Sender
private int cardS
//牌管理对象
private CardManager cardM
public Sender(int cardSum, CardManager cardManager)
this.cardSum = cardS
this.cardManager = cardM
/// &summary&
/// &/summary&
public void SendCard()
//标记该牌是否已发
int[] card = new int[cardSum];
Random rnd = new Random();
//全部初始化为未发
for (int i = 0; i & cardS i++)
card[i] = 0;
for (int i = 0; i & cardS i++)
//随机产生牌号,如果已发,则循环
k = rnd.Next(cardSum);
}while(card[k] == 1);
cardManager.PutFunc(k + 1);
//标记该牌已发过
card[k] = 1;
&&&&&&&& 结果如下:
&&&&&&&& &最后,要提醒一下的是:
&&&&&&&&& 1.在。net2.0以后,微软加强了控件的安全机制,不允许非主线程的线程非委托操控控件,如上面得例子代码提到的。
&&&&&&&&&&&& 当然,有几种方法解决这个问题:
&&&&&&&&&&&&& a.在构造函数里添加一条语句:Control.CheckForIllegalCrossThreadCalls =
&&&&&&&&&&&&&&b.采用委托机制,示例如下:
&&&&&&&&&&&&
//1.声明委托
private delegate void DlgShowThread();
/// &summary&
/// 2.定义被调用方法
/// &/summary&
public void ShowWord()
textBox1.Text = "Welcom to c#";
/// &summary&
///3. 线程直接调用的方法
/// &/summary&
public void ShowThread()
//执行指定委托:Invoke()方法
this.Invoke(new DlgShowThread(ShowWord));
private void button1_Click(object sender, EventArgs e)
//创建一个线程并开始
Thread threadShow = new Thread(new ThreadStart(ShowThread));
threadShow.Start();
&&&&&&& 2.关于控件的访问:
&&&&&&&&& a.遍历同种类型的控件,如上面代码所示:
&&&&&&&&&&&
foreach (Control cnt in this.Controls)
if (cnt is RichTextBox)
((RichTextBox)cnt).Clear();
&&&&&&&&&&& 如果你的访问的控件,仅是在一个名为panel1的容器里面,你可以修改如下:
&&&&&&&&&&&&
foreach (Control cnt in this.panel1.Controls)
if (cnt is RichTextBox)
((RichTextBox)cnt).Clear();
&&&&&&&&&&&& b.通过字符串名转为control类型再具体转为该控件类型来访问控件。常用于批处理多个名字前缀相同的控件,例如文本框textbox1,textbox2.。。,方法:this.Controls.Find(string controlName, bool boolValue)。这里列出部分代码:
&&&&&&&&&&&&&&
Control[] rtb = this.Controls.Find("rtbPlayer" + i.ToString(), true);
receiver[i] = new Receiver(i, cardManager, (RichTextBox)rtb[0], 13);&
&&&&&&&& 3.在示例3中出现的IDisposable接口,该接口主要用途是实现非托管资源的回收。在对象生命结束时,会自动调用Dispose里面的方法。简单的说,就是显示回收资源。定义一个IDisposable类和调用它方法,请看下面示例:
&&&&&&& using S
using System.Collections.G
using System.L
using System.T
namespace IDisposableExample
class Program
/// &summary&
/// 定义一个继承IDisposable接口的类
/// &/summary&
public class MyIDisposable : IDisposable
public MyIDisposable()
//输出一串字符
public void ShowMessage(string strText)
Console.WriteLine(strText);
//Dispose方法,在对象不再使用时,调用的方法。
public void Dispose()
ShowMessage("不再使用该对象,销毁对象,回收资源。");
static void Main(string[] args)
//调用MyIDisposable类的两种方法,两种方法是等效的
//方法一:采用using字段
using (MyIDisposable myIDisposable1 = new MyIDisposable())
myIDisposable1.ShowMessage("该对象正在工作中。。。。");
Console.WriteLine();
//方法二:先创建该对象,再把该对象转为IDisposable类型,调用dispose()方法
MyIDisposable myIDisposable2 = new MyIDisposable();
myIDisposable2.ShowMessage("该对象正在工作中。。。。");
IDisposable idisposable = myIDisposable2 as ID
if (idisposable != null)
idisposable.Dispose();
&&&&&&& 希望对大家有用!在后面,我会继续讲解其他同步线程方法。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:213406次
积分:2137
积分:2137
排名:第8780名
原创:37篇
评论:136条
(3)(13)(9)(15)

我要回帖

更多关于 interlocked游戏 的文章

 

随机推荐