<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: threads code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 18 May 2008 00:12:14 GMT</pubDate>
    <description>DZone Snippets: threads code</description>
    <item>
      <title>Ruby Threading</title>
      <link>http://snippets.dzone.com/posts/show/5212</link>
      <description>Uses Ruby (version 1.8) threading to run code in parallel which reduces the time taken for the script to complete.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'ping' #from core classes&lt;br /&gt;@ip_prefix='192.168.1.'&lt;br /&gt;&lt;br /&gt;def ping_ip(i)&lt;br /&gt;  puts "Found #{@ip_prefix + i.to_s}" if Ping.pingecho(@ip_prefix+i.to_s,1)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;p50 = Thread.new{(1..50).each{|i| ping_ip(i) };puts 'p50-finished'}&lt;br /&gt;p100 = Thread.new{(51..100).each{|i| ping_ip(i) };puts 'p100-finished'}&lt;br /&gt;p150 = Thread.new{(101..150).each{|i| ping_ip(i) }; puts 'p150-finished'}&lt;br /&gt;p200 = Thread.new{(151..200).each{|i| ping_ip(i) }; puts 'p200-finished'}&lt;br /&gt;p254 = Thread.new{(201..254).each{|i| ping_ip(i) }; puts 'p254-finished'}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;output:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Found 192.168.1.2&lt;br /&gt;Found 192.168.1.3&lt;br /&gt;Found 192.168.1.8&lt;br /&gt;Found 192.168.1.9&lt;br /&gt;Found 192.168.1.10&lt;br /&gt;Found 192.168.1.11&lt;br /&gt;Found 192.168.1.12&lt;br /&gt;Found 192.168.1.13&lt;br /&gt;Found 192.168.1.15&lt;br /&gt;Found 192.168.1.110&lt;br /&gt;Found 192.168.1.21&lt;br /&gt;Found 192.168.1.22&lt;br /&gt;Found 192.168.1.140&lt;br /&gt;p50-finished&lt;br /&gt;p150-finished&lt;br /&gt;Found 192.168.1.200&lt;br /&gt;p200-finished&lt;br /&gt;p100-finished&lt;br /&gt;Found 192.168.1.254&lt;br /&gt;p254-finished&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This script took about 1 minute to complete, whereas the non-threaded script took around 4 minutes to complete.&lt;br /&gt;&lt;br /&gt;Reference: Ruby Threads: &lt;a href="http://rubylearning.com/satishtalim/ruby_threads.html"&gt;RUBY THREADS&lt;/a&gt; [rubylearning.com]&lt;br /&gt;&lt;br /&gt;*update 11:21pm*&lt;br /&gt;I tried the same experiment again this time with 26 threads (9 pings each on average) and the script finished in under 15 seconds.&lt;br /&gt;&lt;br /&gt;*update 11:39pm*&lt;br /&gt;A separate thread for each ping seems to work best, since it only took a couple of seconds to finish.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;(1..254).each{|i| Thread.new {puts 'Found ' + ip_prefix + i.to_s if Ping.pingecho(ip_prefix+i.to_s,10)}}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Tue, 11 Mar 2008 23:00:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5212</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>"Extend" the thread class in csharp</title>
      <link>http://snippets.dzone.com/posts/show/4230</link>
      <description>//just inherit from the EasyThread class and override the PerformWork method&lt;br /&gt;&lt;br /&gt;   public class EasyThread: IDisposable&lt;br /&gt;    {&lt;br /&gt;        Thread WorkerThread;&lt;br /&gt;        public EasyThread()&lt;br /&gt;        {&lt;br /&gt;            if (WorkerThread == null)&lt;br /&gt;                WorkerThread = new Thread(new ThreadStart(PerformWork));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        public void Run()&lt;br /&gt;        {&lt;br /&gt;            if (WorkerThread.IsAlive == false)&lt;br /&gt;                WorkerThread.Start();&lt;br /&gt;&lt;br /&gt;            if (WorkerThread.ThreadState == ThreadState.Suspended)&lt;br /&gt;                WorkerThread.Resume();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// EasyThread provides a facade to inheriting from a Thread class.&lt;br /&gt;        /// Override the perform work method to perform your tasks.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        protected virtual void PerformWork()&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Pause()&lt;br /&gt;        {&lt;br /&gt;            WorkerThread.Suspend();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Quit()&lt;br /&gt;        {&lt;br /&gt;            Cleanup();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void Cleanup()&lt;br /&gt;        {&lt;br /&gt;            WorkerThread.Join(0);&lt;br /&gt;            WorkerThread = null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Dispose()&lt;br /&gt;        {&lt;br /&gt;            Cleanup();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;</description>
      <pubDate>Fri, 29 Jun 2007 16:14:22 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4230</guid>
      <author>PWeaver (charlie parker)</author>
    </item>
    <item>
      <title>ParBegin en C++ .net</title>
      <link>http://snippets.dzone.com/posts/show/2667</link>
      <description>Codigo para crear la funcion ParBegin cuyo objetivo es obtener como parametros cualquier cantidad de funciones y ejecutarlas de forma paralela, cada una de ellas en un hilo independiente.&lt;br /&gt;&lt;br /&gt;El objetivo de esta implementacion es realizar el mismo codigo en C++ manejado esto conlleva a algunas restricciones como la imposibilidad de usar ParBegin(...) debido a que segun el documento de Migration_guide de Microsoft dentro de Visual Studio .NET 2003, la utilizacion de los 3 puntos para implementar argumentos variables dentro de una funcion genera inmediatamente que esta funcion sea no manejada y presentan la solucion dentro del mismo documento, documentacion sobre esto tambien se encuentra en el documento managedextensionsspec.doc en la pagina 35.&lt;br /&gt;&lt;br /&gt;El uso de punteros dentro de C++ manejado no es posible, por lo tanto para pasar como argumento de una funcion, otra funcion, lo que se debe hacer es generar un delegate, pero con estoy hay un peque&#241;o impedimento, y es que las funciones deben hacer parte de una clase, osea que no se pueden crear delegates a funciones sino a metodos.&lt;br /&gt;&lt;br /&gt;Con las 2 caracteristicas anteriores en mente mostramos el codigo para de ParBegin para Visual C++ Manejado&lt;br /&gt;&lt;br /&gt;Este codigo pertenece a John Edgar Congote y puede ser modificado, copiado, distribuido, ejecutado, visualizado o manipulado por cualquier medio sin previa autorizacion del autor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;&lt;br /&gt;#using &lt;mscorlib.dll&gt;&lt;br /&gt;&lt;br /&gt;using namespace System;&lt;br /&gt;using namespace System::Threading;&lt;br /&gt;&lt;br /&gt;public __gc class MiHilo{&lt;br /&gt;public:&lt;br /&gt;	MiHilo(){&lt;br /&gt;	&lt;br /&gt;	};&lt;br /&gt;&lt;br /&gt;	~MiHilo(){&lt;br /&gt;	&lt;br /&gt;	};&lt;br /&gt;&lt;br /&gt;	static void funcionHilo(){&lt;br /&gt;		Console::WriteLine(S"Este es un hilo....");&lt;br /&gt;		Thread::Sleep(1000);	//Bloquea el hilo durante 1 segundo.&lt;br /&gt;		Console::WriteLine(S"Saliendo del hilo...");&lt;br /&gt;	}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void ParBegin([ParamArray] ThreadStart * args[]){&lt;br /&gt;	int cont;&lt;br /&gt;	for (cont=0;cont&lt;args-&gt;Length;cont++){		&lt;br /&gt;		Thread *oThread = new Thread(args[cont]);&lt;br /&gt;		oThread-&gt;Start();&lt;br /&gt;	}	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int _tmain(void)&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;	/*&lt;br /&gt;	&lt;br /&gt;	Los argumentos que se pasan a la funcion es el arreglo de delegados&lt;br /&gt;	que los hilos van a ejecutar.&lt;br /&gt;&lt;br /&gt;	Hay que recordar que ThreadStart es un delegate definido en .NET&lt;br /&gt;&lt;br /&gt;	*/&lt;br /&gt;	&lt;br /&gt;	ThreadStart * args[] = {new ThreadStart(0,&amp;MiHilo::funcionHilo),new ThreadStart(0,&amp;MiHilo::funcionHilo),new ThreadStart(0,&amp;MiHilo::funcionHilo)};&lt;br /&gt;&lt;br /&gt;	Console::WriteLine(S"Entrando a ParBegin");&lt;br /&gt;	ParBegin(args);&lt;br /&gt;	Console::WriteLine(S"Saliendo de ParBegin");&lt;br /&gt;	Thread::Sleep(2000); //Durmiendo 2 Segundos&lt;br /&gt;	Console::WriteLine(S"Finalizando Programa");&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 22 Sep 2006 20:59:45 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2667</guid>
      <author>jcongote (John Edgar Congote Calle)</author>
    </item>
  </channel>
</rss>
