۱۳۹۱/۰۳/۰۹

Drag کردن اجسام در Box2D

قبلا در مورد Box2D مطلب کوتاهی نوشتم در مثال زیر روش drag کردن اجسام را نشان می دهم.

با تغییر در کد خط 89 یعنی مقدار mouse_joint.maxForce مي توان روي قىرت پرتاب اجسام توسط mouse اثر گذاشت.


package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import Box2D.Dynamics.*;
 import Box2D.Collision.*;
 import Box2D.Collision.Shapes.*;
 import Box2D.Common.Math.*;
 import Box2D.Dynamics.Joints.*;
 public class cratetest extends Sprite {
  public var m_world:b2World;
  public var m_iterations:int = 10;
  public var m_timeStep:Number = 1/30;
  public var mousePVec:b2Vec2 = new b2Vec2();
  public var real_x_mouse:Number;
  public var real_y_mouse:Number;
  public var pixels_in_a_meter = 30;
  public var worldAABB:b2AABB = new b2AABB();
  public var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
  public var mouseJoint:b2MouseJoint;
  public function cratetest() {
   addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
   stage.addEventListener(MouseEvent.MOUSE_DOWN, on_mouse_down);
   stage.addEventListener(MouseEvent.MOUSE_UP, on_mouse_up);
   worldAABB.lowerBound.Set(-100.0, -100.0);
   worldAABB.upperBound.Set(100.0, 100.0);
   m_world = new b2World(worldAABB, gravity, true);
   var body:b2Body;
   var bodyDef:b2BodyDef;
   var boxDef:b2PolygonDef;
   bodyDef = new b2BodyDef();
   bodyDef.position.Set(8.5, 13.5);
   boxDef = new b2PolygonDef();
   var ground_width = 8.5;
   var ground_height = 0.5;
   boxDef.SetAsBox(ground_width, ground_height);
   boxDef.friction = 0.3;
   boxDef.density = 0;
   bodyDef.userData = new floor();
   bodyDef.userData.width = ground_width * 2 * pixels_in_a_meter;
   bodyDef.userData.height = ground_height * 2 * pixels_in_a_meter;
   addChild(bodyDef.userData);
   body = m_world.CreateBody(bodyDef);
   body.CreateShape(boxDef);
   body.SetMassFromShapes();
   for (var i:int = 1; i <=5; i++) {
    bodyDef = new b2BodyDef();
    bodyDef.position.x = Math.random() * 15 + 1;
    bodyDef.position.y = Math.random();
    var crate_width:Number = 1.5;
    var crate_height:Number = 1.5;
    boxDef = new b2PolygonDef();
    boxDef.SetAsBox(crate_width, crate_height);
    boxDef.density = 1.0;
    boxDef.friction = 0.5;
    boxDef.restitution = 0.2;
    bodyDef.userData = new crate();
    bodyDef.userData.width = crate_width * 2 * pixels_in_a_meter;
    bodyDef.userData.height = crate_height * 2* pixels_in_a_meter;
    body = m_world.CreateBody(bodyDef);
    body.CreateShape(boxDef);
    body.SetMassFromShapes();
    addChild(bodyDef.userData);
   }
  }
  public function Update(e:Event):void {
   m_world.Step(m_timeStep, m_iterations);
   if (mouseJoint) {
    var mouseXWorldPhys = mouseX/pixels_in_a_meter;
    var mouseYWorldPhys = mouseY/pixels_in_a_meter;
    var p2:b2Vec2 = new b2Vec2(mouseXWorldPhys, mouseYWorldPhys);
    mouseJoint.SetTarget(p2);
   }
   for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
    if (bb.m_userData is Sprite) {
     bb.m_userData.x = bb.GetPosition().x * pixels_in_a_meter;
     bb.m_userData.y = bb.GetPosition().y * pixels_in_a_meter;
     bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
    }
   }
  }
  public function on_mouse_down(evt:MouseEvent):void {
   var body:b2Body = GetBodyAtMouse();
   if (body) {
    var mouse_joint:b2MouseJointDef = new b2MouseJointDef;
    mouse_joint.body1 = m_world.GetGroundBody();
    mouse_joint.body2 = body;
    mouse_joint.target.Set(mouseX/pixels_in_a_meter, mouseY/pixels_in_a_meter);
    mouse_joint.maxForce = 10000;
    mouse_joint.timeStep = m_timeStep;
    mouseJoint = m_world.CreateJoint(mouse_joint) as b2MouseJoint;
   }
  }
  public function on_mouse_up(evt:MouseEvent):void {
   if (mouseJoint) {
    m_world.DestroyJoint(mouseJoint);
    mouseJoint = null;
   }
  }
  public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body {
   real_x_mouse = (stage.mouseX)/pixels_in_a_meter;
   real_y_mouse = (stage.mouseY)/pixels_in_a_meter;
   mousePVec.Set(real_x_mouse, real_y_mouse);
   var aabb:b2AABB = new b2AABB();
   aabb.lowerBound.Set(real_x_mouse - 0.001, real_y_mouse - 0.001);
   aabb.upperBound.Set(real_x_mouse + 0.001, real_y_mouse + 0.001);
   var k_maxCount:int = 10;
   var shapes:Array = new Array();
   var count:int = m_world.Query(aabb, shapes, k_maxCount);
   var body:b2Body = null;
   for (var i:int = 0; i < count; ++i) {
    if (shapes[i].m_body.IsStatic() == false || includeStatic) {
     var tShape:b2Shape = shapes[i] as b2Shape;
     var inside:Boolean = tShape.TestPoint(tShape.m_body.GetXForm(), mousePVec);
     if (inside) {
      body = tShape.m_body;
      break;
     }
    }
   }
   return body;
  }
 }
}


  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۹۱/۰۳/۰۴

مقدمه اب براستارلینگ - قسمت اول

استارلینگ را می شناسید؟

یک موتور سورس باز برای ساخت بازی در فلش که از قابلیت های جدید فلش پلیر (Stage3D) استفاده می کند.Stage3D عليرغم نامش توانايي ايجاد پروژه های دو بعدی را نیز دارد . در مثال زیر نحوه انجام یک پروژه دوبعدی ساده را باهم مرور می کنیم.

برای راحتی بیشتر بهتر است از نسخه 4.6 فلاش بیلدر استفاده کنید.

ابتدا مانند تصویر زیر یک پروژه اکشن اسکریپت را شروع کنید:


بعد از نامگذاری پروژه و تعیین مسیر ذخیره آن بجای دکمه Finish  روی دکمه Next كليك كنيد.


در تب Source Path مسیر پوشه Starling\src را ىر پوشه کتابخانه استارلینگ که قبلا دانلود کرده اید را وارد نمایید..

خب حالا وقت کد نویسی است خیلی ساده یک نمونه از استارلینگ ایجاد کنید :
package{
 import flash.display.Sprite;
 import starling.core.Starling;
 
 [SWF(width="500", height="500", frameRate="60", backgroundColor="#000000")]
 public class Main extends Sprite{
  private var starling:Starling;
  public function Main(){
   starling = new Starling(Game, stage);
   starling.start();
  }
 }
}

وسپس فایل Game.as :

package{
 import starling.display.Image;
 import starling.display.Sprite;
 import starling.events.Event;
 
 public class Game extends Sprite{
  [Embed(source = "background.png")]
  private static const Background:Class;
 
  [Embed(source = "greencircle.png")]
  private static const GreenCircle:Class;
 
  private var greenCircleVector:Vector.=new Vector.();
  private var xSpeedVector:Vector.=new Vector.();
  private var ySpeedVector:Vector.=new Vector.();
 
  public function Game(){
   addEventListener(Event.ADDED_TO_STAGE,setup);
  }
 
  private function setup(e:Event):void{
   var background:Image = Image.fromBitmap(new Background());
   addChild(background);  
   for(var i:uint=0;i<10;i++){
    var greenCircle:Image=Image.fromBitmap(new GreenCircle());
    greenCircle.x=Math.random()*500;
    greenCircle.y=Math.random()*500;
    var randomDirection:Number=Math.random()*2*Math.PI;
    addChild(greenCircle);
    greenCircleVector.push(greenCircle);
    xSpeedVector.push(2*Math.cos(randomDirection));
    ySpeedVector.push(2*Math.sin(randomDirection));
   } 
   stage.addEventListener(Event.ENTER_FRAME, update);
  }
 
  private function update(e:Event):void{
   for(var i:uint=0;i500){
     greenCircleVector[i].x-=500;
    }
    if(greenCircleVector[i].x<0){
     greenCircleVector[i].x+=500;
    }
    if(greenCircleVector[i].y>500){
     greenCircleVector[i].y-=500;
    }
    if(greenCircleVector[i].y<0){
     greenCircleVector[i].y+=500;
    }
   }
  }
 }
}

در کد بالا به نحوه استفاده از کلاسهای رویداد و اسپرایت که از بسته استارلینگ گرفته شده اند دقت کنید. این کلاسها جایگزین معادل فلش خود شده اند. نمونه اولیه ایجاد شد. در بخش های بعدی کار را برای تولید بازی ادامه خواهیم داد.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۹۱/۰۲/۲۹

نکاتی در مورد اجسام در Box2D

Box2d يك موتور سورس باز شبیه ساز فیزیک در فلاش است که دارای یک نسخه ++C هم مي باشد.
یکی از مفاهیم کلیدی در این موتور مفهموم بادی یا جسم است که در حقیقت یک موجودیت واحد بدون انعطاف است و به سه صورت زیر دیده می شود.

1- جسم غیر ایستا : این نوع جسم تحت تاثیر نیروهای محیطی قرار می گیرد و به برخوردها واکنش نشان می دهد.
2- جسم ایستا : دقیقا بر عکس جسم غیر ایستا است. تحت اثر هیچ نیرویی قرار نمی گیرد و کاملا بی حرکت است.
3 - جسم کینماتیک : در حقیفت یک نوع ترکیبی است از یک طرف مانند جسم ایستا به نیروهای محیطی واکنش نشان نمی دهد و از طرفی دیگر مانند جسم غیر ایستا متحرک است. یعنی با سرعتی مشخص در یک مسیر خطی حرکت می کند .

مثال زیر مطلب را بهتر شرح می دهد:



package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.utils.Timer;
 import flash.events.TimerEvent;
 import Box2D.Dynamics.*;
 import Box2D.Collision.*;
 import Box2D.Collision.Shapes.*;
 import Box2D.Common.Math.*;
 public class Main extends Sprite {
  private var world:b2World=new b2World(new b2Vec2(0,5),true);
  private var worldScale:Number=30;
  private var timer:Timer=new Timer(1000);
  public function Main() {
   debugDraw();
   for (var i:int=0; i<10; i++) {
    // building 10 kinematic spheres
    // five on the left side of the stage moving right
    // five on the right side of the stage moving left
    kinematicSphere(640*(i%2),50+40*i,10,(1-2*(i%2))*(Math.random()*10+5));
   }
   addEventListener(Event.ENTER_FRAME,updateWorld);
   // I will make a dynamic sphere fall from the top of the stage
   // at every second
   timer.start();
   timer.addEventListener(TimerEvent.TIMER,addSphere);
  }
  private function addSphere(e:TimerEvent):void {
   dynamicSphere(320,-10,10);
  }
  private function dynamicSphere(pX:int,pY:int,r:Number):void {
   var bodyDef:b2BodyDef=new b2BodyDef();
   bodyDef.position.Set(pX/worldScale,pY/worldScale);
   bodyDef.type=b2Body.b2_dynamicBody;
   var circleShape:b2CircleShape=new b2CircleShape(r/worldScale);
   var fixtureDef:b2FixtureDef=new b2FixtureDef();
   fixtureDef.shape=circleShape;
   var theDynamic:b2Body=world.CreateBody(bodyDef);
   theDynamic.CreateFixture(fixtureDef);
  }
  private function kinematicSphere(pX:int,pY:int,r:Number,hV):void {
   var bodyDef:b2BodyDef=new b2BodyDef();
   bodyDef.position.Set(pX/worldScale,pY/worldScale);
   // ************************** HERE IS THE MAGIC LINE ************************** \\
   bodyDef.type=b2Body.b2_kinematicBody;
   var circleShape:b2CircleShape=new b2CircleShape(r/worldScale);
   var fixtureDef:b2FixtureDef=new b2FixtureDef();
   fixtureDef.shape=circleShape;
   var theKinematic:b2Body=world.CreateBody(bodyDef);
   theKinematic.CreateFixture(fixtureDef);
   // look, I can set a linear velocity
   theKinematic.SetLinearVelocity(new b2Vec2(hV,0));
  }
  private function debugDraw():void {
   var debugDraw:b2DebugDraw=new b2DebugDraw();
   var debugSprite:Sprite=new Sprite();
   addChild(debugSprite);
   debugDraw.SetSprite(debugSprite);
   debugDraw.SetDrawScale(worldScale);
   debugDraw.SetFlags(b2DebugDraw.e_shapeBit);
   debugDraw.SetFillAlpha(0.5);
   world.SetDebugDraw(debugDraw);
  }
  private function updateWorld(e:Event):void {
   world.Step(1/30,10,10);
   world.ClearForces();
   for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) {
    // changing kinematic sphere linear velocity if it touches stage edges
    if (b.GetType()==b2Body.b2_kinematicBody) {
     var xSpeed:Number=b.GetLinearVelocity().x;
     var xPos:Number=b.GetWorldCenter().x*worldScale;
     if ((xPos<10&&xSpeed<0) || (xPos>630&&xSpeed>0)) {
      xSpeed*=-1;
      b.SetLinearVelocity(new b2Vec2(xSpeed,0));
     }
    }
    else {
     if (b.GetWorldCenter().y*worldScale>480) {
      world.DestroyBody(b);
     }
    }
   }
   world.DrawDebugData();
  }
 }
}
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۸۹/۱۰/۳۰

اضافه کردن یک باکس جستجو به منو در WordPress

برای اینکار در ورد پرس 3 به بعد باید کدهای زیر را در فایل functions.php که در پوشه تم موجود است قرار دهید اگر این فایل را ندارید با استفاده از یک ویرایشگر متن ساده آن را ایجاد کنید.

add_filter('wp_nav_menu_items','add_search_box', 10, 2);
function add_search_box($items, $args) {

        ob_start();
        get_search_form();
        $searchform = ob_get_contents();
        ob_end_clean();

        $items .= '
  • ' . $searchform . '
  • '; return $items; }

    به همین سادگی!!!
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    ۱۳۸۹/۱۰/۲۲

    اصول برنامه نویسی موازی درNET. نسخه 4 بخش اول - 6

    ایجاد یک کنسل کننده ترکیبی برای چندین Task

    می‌توانید با استفاده از چند CancellationToken یک Token ترکیبی ایجاد نمود در این حالت با کنسل شدن هر کدام از Token های زیر مجموعه خود Token اصلی کنسل خواهد شد.این امر با قرار دادن Token ها در متد CreateLinkedTokenSource از کلاس CancellationTokenSource محقق می‌شود مثال :

    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_11 {
    
    class Listing_11 {
    
    static void Main(string[] args) {
    
    // create the cancellation token sources
    
    CancellationTokenSource tokenSource1 = new CancellationTokenSource();
    
    CancellationTokenSource tokenSource2 = new CancellationTokenSource();
    
    CancellationTokenSource tokenSource3 = new CancellationTokenSource();
    
    // create a composite token source using multiple tokens
    
    CancellationTokenSource compositeSource =
    
    CancellationTokenSource.CreateLinkedTokenSource(
    
    tokenSource1.Token, tokenSource2.Token, tokenSource3.Token);
    
    // create a cancellable task using the composite token
    
    Task task = new Task(() => {
    
    // wait until the token has been cancelled
    
    compositeSource.Token.WaitHandle.WaitOne();
    
    // throw a cancellation exception
    
    throw new OperationCanceledException(compositeSource.Token);
    
    }, compositeSource.Token);
    
    // start the task
    
    task.Start();
    
    // cancel one of the original tokens
    
    tokenSource2.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    }
    

    چگونه می‌توان تعیین کرد یک Task کنسل شده است؟

    با استفاده از خصوصیت IsCancelled از کلاس Task می‌توان تعیین نمود که یک Task کنسل شده است یا خیر.

    اگر true باشد یعنی فرایند کنسل شدن بدرستی انجام شده است در غیر این صورت Task کنسل نشده است.مثال :

    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_12 {
    
    class Listing_12 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource1 = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token1 = tokenSource1.Token;
    
    // create the first task, which we will let run fully
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < 10; i++) {
    
    token1.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 1 - Int value {0}", i);
    
    }
    
    }, token1);
    
    // create the second cancellation token source
    
    CancellationTokenSource tokenSource2 = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token2 = tokenSource2.Token;
    // create the second task, which we will cancel
    
    Task task2 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    token2.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 2 - Int value {0}", i);
    
    }
    
    }, token2);
    
    // start all of the tasks
    
    task1.Start();
    
    task2.Start();
    
    // cancel the second token source
    
    tokenSource2.Cancel();
    
    // write out the cancellation detail of each task
    
    Console.WriteLine("Task 1 cancelled? {0}", task1.IsCanceled);
    
    Console.WriteLine("Task 2 cancelled? {0}", task2.IsCanceled);
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    
    در مثال فوق دو Task ایجاد شده است. هر دو Task از دو CancellationToken مختلف که دو CancellationTokenSource متفاوت دارند استفاده می نمایند. CancellationTokenSource برای Task دوم کنسل می‌شود اما Task اول اجازه دارد که وظیفه‌اش را بطور کامل انجام دهد. خروجی برنامه چنین خواهد بود :
    Task 1 cancelled? False Task 2 cancelled? True Task 1 - Int value 0 … Task 1 - Int value 9 Main method complete. Press enter to finish.
    انتظار برای گذشت زمان
    هنگام کاربا Task ها در برخی از موارد لازم است برای مدت زمانی خاص برنامه درنگ کند.مثلا در هنگام اجرای یک Task لازم است برنامه مقداری را بدست آورد و ادامه برنامه با توجه به مقدار بدست آمده اجرا شود برای این کار لازم است Task برای مدت زمانی خاص صبر کند یا اصطلاحاً بخواب رود.بعد از سپری شدن مدت زمان مورد نظر Task از خواب بیدار شده و کارش را ادامه خواهد داد.در ادامه روشهای خواب کردن Task ها را مورد بررسی قرار خواهیم داد.
    استفاده از هندل انتظار Cancellation Token
    این روش بهترین راه برای خواب کردن یک Task می باشد.همانطور که قبلاً دیدیم برای اینکه یک Task را کنسل کنیم ابتدا نمونه‌ای از کلاس CancellationTokenSource را تعریف می‌کنیم سپس با کمک خصوصیت Token آن شی CancellationToken را مقدار دهی می‌کنیم در آخر کار با استفاده از متد خصوصیت WaitHandle و متد WaitOne می‌توان Task را کنسل نمود. اما متد WaitOne می‌تواند پارامتری را به عنوان زمان داشته باشد که Task را برای مدت زمانی خاص بر حسب میلی ثانیه قبل از کنسل شدن بخواب ببرد. مثال زیر موضوع را شفاف می‌کند :
    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_13 {
    
    class Listing_13 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the first task, which we will let run fully
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < Int32.MaxValue; i++) {
    // put the task to sleep for 10 seconds
    
    bool cancelled = token.WaitHandle.WaitOne(10000);
    
    // print out a message
    
    Console.WriteLine("Task 1 - Int value {0}. Cancelled? {1}",i, cancelled);
    
    // check to see if we have been cancelled
    
    if (cancelled) {
    
    throw new OperationCanceledException(token);
    
    }
    
    }
    
    }, token);
    
    // start task
    
    task1.Start();
    
    // wait for input before exiting
    
    Console.WriteLine("Press enter to cancel token.");
    
    Console.ReadLine();
    
    // cancel the token
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    
    در کد بالا یک Task ایجاد شده که یک پیغام را به خروجی می‌فرستد سپس با استفاده از متد WaitOne به مدت 10 ثانیه بخواب می‌رود .برنامه تا زمان دریافت کلید Enter از کاربر پیغام ها به خروجی می فرستد. و در صورت کنسل شدن Task پایان می‌یابد البته زمانی کنسل شدن صورت می‌گیرد که زمان 10 ثانیه سپری شده باشد.
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    ۱۳۸۹/۱۰/۲۱

    شمارش تعداد لینکهای موجود در قسمت blogroll

    نیاز داشتم تا در سایتی تعداد لینکهای موجود در blogroll شمارش کرده و به کاربر نشان دهم
    یک شی بنامwpfb$ و مقداری کد sql مشکل رو حل کرد.

    کد زیر :
    <?php
    $numlinks = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->links WHERE link_visible = 'Y'");
    if (0 < $numlinks) $numlinks = number_format($numlinks);
    echo $numlinks;
    ?>
    
    
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    تغییر ویرایشگر پیش فرض در WordPress

    در دشبورد ورد پرس بطور پیش فرض از ادیتور Visual Editor استفاده می شود.
    برای اینکه از ادیتور دیگری مثلا HTML editor استفاده شود باید کد زیر را در در فایل functions.php قرار دهیم.

    add_filter('wp_default_editor', create_function('', 'return "html";'));
    

    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    ۱۳۸۹/۱۰/۲۰

    اصول برنامه نویسی موازی درNET. نسخه 4 بخش اول - 5

    مونیتور کردن فرایند کنسل شدن با کمک Delegate

    براحتی می‌توانید یک Delegate را با یک CancellationToken ثبت کنید و در هنگامی که متد Cancel صدا زده می‌شود از آن استفاده نمود .این روش در برنامه‌هایی که دارای رابط کاربری هستند مثل برنامه‌های WinForm یاWPF مفید است . اگردر Task مورد نظر پروسه غیر همزمان دیگری مثل خواندن و نوشتن روی دیسک انجام می‌شود این روش بسیار مفید است و Delegate ترید اصلی برنامه را براحتی از دریافت درخواست کنسل شدن Task آگاه می کند. مثال :
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_08 {
    
    class Listing_08 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the task
    
    Task task = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    if (token.IsCancellationRequested) {
    
    Console.WriteLine("Task cancel detected");
    
    throw new OperationCanceledException(token);
    
    } 
    else
     {
    
    Console.WriteLine("Int value {0}", i);
    
    }
    
    }
    
    }, token);
    
    // register a cancellation delegate
    
    token.Register(() => {
    
    Console.WriteLine(">>>>>> Delegate Invoked\n");
    
    });
    
    // wait for input before we start the task
    
    Console.WriteLine("Press enter to start task");
    
    Console.WriteLine("Press enter again to cancel task");
    
    Console.ReadLine();
    
    // start the task
    
    task.Start();
    
    // read a line from the console.
    
    Console.ReadLine();
    
    // cancel the task
    
    Console.WriteLine("Cancelling task");
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    

    تنها تفاوت دو مثال قبلی دراستفاده از متد Register از کلاس CancellationToken می باشد. متد Register یک نمونه از کلاس Action را دریافت کرده و در هنگام کنسل کردن Task نمونه کلاس Action را اجرا می کند.

    مونیتور کردن فرایند کنسل شدن با استفاده از هندل انتظار یا Wait Handle


    در این روش از متد WaitOne ازخصوصیت WaitHandle کلاس CancellationToken استفاده می‌شود . در مثال زیر دو Task وجود دارد Task دوم متد WaitOne را از token که در Task اول استفاده می‌شود را صدا می‌زند این امر موجب بلاک شدن ترید تا زمان مشخص شدن تکلیف کنسل شدن Task اول می‌شود :

    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_09 {
    
    class Listing_09 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the task
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    if (token.IsCancellationRequested) {
    
    Console.WriteLine("Task cancel detected");
    
    throw new OperationCanceledException(token);
    
    }
     else 
    {
    
    Console.WriteLine("Int value {0}", i);
    
    }
    
    }
    
    }, token);
    
    // create a second task that will use the wait handle
    
    Task task2 = new Task(() => {
    
    // wait on the handle
    
    token.WaitHandle.WaitOne();
    
    // write out a message
    
    Console.WriteLine(">>>>> Wait handle released");
    
    });
    
    // wait for input before we start the task
    
    Console.WriteLine("Press enter to start task");
    
    Console.WriteLine("Press enter again to cancel task");
    
    Console.ReadLine();
    
    // start the tasks
    
    task1.Start();
    
    task2.Start();
    
    // read a line from the console.
    
    Console.ReadLine();
    
    // cancel the task
    
    Console.WriteLine("Cancelling task");
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    }
    
    }
    
    }
    

    کنسل کردن چندین Task بطور همزمان
    با تعریف یک نمونه از کلاس CancellationToken و استفاده از آن در هنگام ایجاد چند Task براحتی می‌توانید با یک بار صدا کردن متد Cancel تمام Task ها را با هم کنسل نمود . مثال :
    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_10 {
    
    class Listing_10 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the tasks
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    token.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 1 - Int value {0}", i);
    
    }
    
    }, token);
    
    Task task2 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    token.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 2 - Int value {0}", i);
    }
    
    }, token);
    
    // wait for input before we start the tasks
    
    Console.WriteLine("Press enter to start tasks");
    
    Console.WriteLine("Press enter again to cancel tasks");
    
    Console.ReadLine();
    
    // start the tasks
    
    task1.Start();
    
    task2.Start();
    
    // read a line from the console.
    
    Console.ReadLine();
    
    // cancel the task
    
    Console.WriteLine("Cancelling tasks");
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    ۱۳۸۹/۱۰/۱۸

    آموزش jquery - قسمت اول

    دوستی دارم خیلی علاقه داره با jquery کار کنه اما خب ندانستن زبان انگلیسی و همچنین نبود یک مرجع خوب فارسی باعث شده که دچار مشکل بشه.

    سعی می کنم که با زبان خیلی ساده قابلیتها و مشخصات این کتابخانه قدرتمند توسعه وب رو شرح بدم.

    مقدمه
    jquery یک کتابخانه بسیار قدرتمند جاوا اسکریپت است که با کمک آن می توان روی html خروجی در مرورگر تغییرات مورد نظر را اعمال کرد.برای کار باjquery آشنایی کامل با htmlو javascript ضروری است.

    jquery برای کار با عناصر روی یک صفحه وب نیازمند است که از لود شدن همه عناصر اطمینان حاصل کند برای این کار از تابع زیر استفاده می کند :

    $(document).ready(function() {
        console.log('ready!');
    });
    
    کد بالا با خطوط زیر معادل است :

    $(function() {
        console.log('ready!');
    });
    

    همچنین می توان بعنوان پارامتر نام یک تابع رو به
    $(document).ready()
    پاس نمود مثال :
    function readyFn() {
        // code to run when the document is ready
    }
    $(document).ready(readyFn);
    

    انتخاب عناصر صفحه با کمک jquery

    انتخاب عناصر یک صفحه وب با هدف اعمال تغییر روی آنها صورت می گیرد.
    با چندین روش می توان عناصر را انتخاب نمود.

    - انتخاب با کمک ID مثال :

    $('#myId'); // note IDs must be unique per page
    

    - انتخاب با کمک نام کلاس . مثال :
    $('div.myClass'); // performance improves if you specify element type
    

    - انتخاب با کمک صفت یک عنصر. این روش ممکن است کند باشد . مثال:

    $('input[name=first_name]'); // beware, this can be very slow
    

    - انتخاب با کمک ترکیب کردن انتخابگرهای CSS مثال :

    $('#contents ul.people li');
    

    - انتخاب با کمک شبه انتخابگرها . مثال :

    $('a.external:first'); 
    $('tr:odd');
    $('#myForm :input');   // select all input-like elements in a form
    $('div:visible');
    $('div:gt(2)');        // all except the first three divs
    $('div:animated');     // all currently animated divs
    
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    اصول برنامه نویسی موازی درNET. نسخه 4 بخش اول - 4


    کنسل کردن Taskها

    کی از مباحث جدید در Task Programming Library بحث کنسل کردن Task ها می باشد. البته با روشهای معمول برنامه نویسی ترید ها نیز می‌توان امر را محقق نمود اما خب در دات نت 4 برای کاهش ریسک خطاهای نا خواسته تدابیر بخصوصی اندیشیده شده است. در ادامه خواهید دید چگونه می‌توان یک Task را کنسل کرد یا حتی آن را بخواب برد.

    ایجاد یک Task که آن را بتوان براحتی کنسل کرد دارای چهار مرحله است :

    مرحله اول - یک نمونه از کلاس System.Threading.CancellationTokenSource را ایجاد کنید:

    CancellationTokenSource tokenSource = new CancellationTokenSource;
    
    
    

    مرحله دوم - یک نمونه از کلاس CancellationToken را ایجاد کرده و آن را با استفاده از خصوصیت Token نمونه کلاسی که در مرحله قبلی ایجاد کردیم مقدار دهی می کنیم:

    CancellationToken token = tokenSource.Token;
    
    

    مرحله سوم – یک نمونه از Task را که دارای نوع خروجی باشد را ایجاد می‌کنیم این Task باید از متغیر token که در مرحله قبلی ایجاد کردیم و یک delegate Action بعنوان بدنه استفاده کند:

    Task task1 = new Task(new Action(myMethod), token);
    
    مرحله چهارم – متد Start از Task ایجاد شده در مرحله قبل را صدا کنید.

    خب الان چطور این Task را کنسل کنیم؟

    براحتی می‌توان متد Cancel از شی tokenSource را صدا کرد و Task را کنسل نمود.

    دات نت یک Task را مجبور به کنسل شدن نمیکند . خود برنامه باید CancellationTokenSource را زیر نظر بگیرد و زمانی که درخواست کنسل شدن Task رسیدبا کمک آن Task را کنسل کند. به این پروسه اصطلاحاًیک فرایند Cooperative گویند.

    پس برای کنسل کردن مونیتور کردن یک Task بسیار مهم است. در ادامه به انواع روشهای مونیتور کردن Task ها می پردازیم.

    مونیتور کردن فرایند کنسل شدن بروش نظر سنجی یا Polling


    در بدنه بعضی از Taskها حلقه هایی برای پردازش اطلاعات وجود دارد . در این حلقه ها می‌توان با بررسی مقدار true خصوصیت IsCancellationRequested که در کلاس CancellationToken وجود دارد از حلقه خارج شد و منابع Task مثل اتصالات به دیتابیس و غیره را آزاد نمود . البته باید یک نمونه از System.Threading.OperationCanceledException کلاس استثناء را هم ایجاد نمود. اگر این نمونه از کلاس استثناء ایجاد نشود وضعیت Task نامشخص خواهد ماند. مثال :

    while (true) {
    
    if (token.IsCancellationRequested) {
    
    // tidy up and release resources
    
    throw new OperationCanceledException(token);
    
    } else {
    
    // do a unit of work
    
    }
    
    }
    

    اگر هیچ منبعی در Task مورداستفاده قرار نگرفته است براحتی می‌توانید با استفاده از متد ThrowIfCancellationRequested کد بالا را ساده نمود:

    while (true) {
    
    token.ThrowIfCancellationRequested();
    
    // do a unit of work
    
    }
    
    }
    

    اکنون به یک مثال کاملتر می‌پردازیم :

    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    namespace Listing_07 {
    
    class Listing_07 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the task
    
    Task task = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    if (token.IsCancellationRequested) {
    
    Console.WriteLine("Task cancel detected");
    
    throw new OperationCanceledException(token);
    
    } 
    else 
    {
    
    Console.WriteLine("Int value {0}", i);
    
    }
    
    }
    
    }, token);
    
    // wait for input before we start the task
    
    Console.WriteLine("Press enter to start task");
    
    Console.WriteLine("Press enter again to cancel task");
    
    Console.ReadLine();
    
    // start the task
    
    task.Start();
    
    // read a line from the console.
    
    Console.ReadLine();
    // cancel the task
    
    Console.WriteLine("Cancelling task");
    
    tokenSource.Cancel();
    
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis