threads de windows

7 views
Skip to first unread message

Luciano Dzisiuk

unread,
Oct 5, 2010, 9:30:09 PM10/5/10
to C Talks
Buenas!
queria sacarme una duda:
si yo llamo a la funcion _beginthreadex dentro de un hilo que cree
antes, me vuelve a crear un hilo "hijo" del proceso principal? hay
algun detalle que cambie cuando llamo a esa funcion desde mi proceso
principal o desde uno de los hilos?

muchísimas gracias!

abrazo!

Matías Dumrauf

unread,
Oct 6, 2010, 10:10:37 AM10/6/10
to c-t...@googlegroups.com
Hola Luciano,

La respuesta es no. Si vos creás un hilo dentro de un hilo, no pasa a ser hilo del proceso principal. Justamente se crea un hilo de ese hilo. De echo, si nos remitimos a la Talk II cuando explicamos Threads, la necesidad de crear hilos surge de querer que el "hilo principal" (no el main necesariamente) ejecute más de una tarea al mismo tiempo.

La forma correcta de llamar a _beginthreadex() sería la siguiente:

HANDLE hThread = (HANDLE) _beginthreadex(NULL, 1024*1024, &routine, (LPVOID) argument ,0 , NULL);


Donde 1024*1024 es el Tamaño del Stack del Thread, routine la función que es la lógica del Thread y argument un puntero al argumento que va a recibir (si se requiere más de un argumento, utilizar una estructura).

Saludos,

Matías

--
Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a c-t...@googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
c-talks+u...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com.ar/group/c-talks?hl=es.

Luciano Dzisiuk

unread,
Oct 7, 2010, 11:58:43 AM10/7/10
to C Talks
Muchisimas gracias! mi miedo era que no te deje crear un thread dentro
de otro.

Saludos! y gracias de nuevo.

On 6 oct, 11:10, Matías Dumrauf <matias.dumr...@gmail.com> wrote:
> Hola Luciano,
>
> La respuesta es no. Si vos creás un hilo dentro de un hilo, no pasa a ser
> hilo del proceso principal. Justamente se crea un hilo de ese hilo. De echo,
> si nos remitimos a la Talk II cuando explicamos Threads, la necesidad de
> crear hilos surge de querer que el "hilo principal" (no el main
> necesariamente) ejecute más de una tarea al mismo tiempo.
>
> La forma correcta de llamar a _beginthreadex() sería la siguiente:
>
> HANDLE hThread = (HANDLE) _beginthreadex(NULL, 1024*1024, &routine, (LPVOID)
> argument ,0 , NULL);
>
> Donde *1024*1024* es el Tamaño del Stack del Thread, *routine* la función
> que es la lógica del Thread y *argument* un puntero al argumento que va a
> recibir (si se requiere más de un argumento, utilizar una estructura).
>
> Saludos,
>
> Matías
>
> El 5 de octubre de 2010 22:30, Luciano Dzisiuk
> <dzisiukluci...@gmail.com>escribió:
>
> > Buenas!
> > queria sacarme una duda:
> > si yo llamo a la funcion _beginthreadex dentro de un hilo que cree
> > antes, me vuelve a crear un hilo "hijo" del proceso principal? hay
> > algun detalle que cambie cuando llamo a esa funcion desde mi proceso
> > principal o desde uno de los hilos?
>
> > muchísimas gracias!
>
> > abrazo!
>
> > --
> > Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
> > Si quieres publicar en este grupo, envía un mensaje de correo
> > electrónico a c-t...@googlegroups.com
> > Para anular la suscripción a este grupo, envía un mensaje a
> > c-talks+u...@googlegroups.com<c-talks%2Bunsu...@googlegroups.com>

Gaston J. Sosa

unread,
Oct 7, 2010, 12:28:02 PM10/7/10
to c-t...@googlegroups.com
Hola gente, ya que ustedes saben de todo, yo me mate buscando info sobre las
colas queue, en si ejemplos para probar y poder modificar, hay muy poca info
dando vuelta a nivel de ejemplos dignos, sobretodo de lo que atañe al
problema en cuestión en el tp, darle prioridades a las colas.

Por la documentación de Microsoft en ingles llego a entender que se le
pueden dar 8 niveles de prioridades, que por defecto va en 3 todo mensaje a
la cola.

Cualquier ayuda dirección de hacia dónde correr será sumamente valorada.

Gaston J. Sosa

__________ Información de ESET NOD32 Antivirus, versión de la base de firmas
de virus 5512 (20101007) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

Luciano Dzisiuk

unread,
Oct 8, 2010, 3:37:23 PM10/8/10
to C Talks
Si a lo que te referis es a las colas del WS, yo me cree una
estructura de lo que seria un nodo, con un campo que tenga la
prioridad, y otro campo un puntero al mismo tipo de estructura (que
vendria a ser el siguiente nodo) y con eso masomenos te podrias armar
una lista como en algoritmos, recorrerla a partir de un puntero
inicial [hasta llegar a NULL ;)] y ver las prioridades. Por ejemplo:

typedef struct node_job_struct
{
struct node_job_struct* next;

/* ...
* alguna que otra cosa mas
* ...
*/

int priority;

} node_job_ptr;

typedef node_job_ptr* primer_elemento_de_tu_lista;



Saludos

Matías Dumrauf

unread,
Oct 12, 2010, 10:08:30 AM10/12/10
to c-t...@googlegroups.com
Hola Gastón, cómo va todo? Perdona que tardé en contestar, estuve poniéndome al día con algunas materias y no prendí la notebook.
Nosé como se maneja en el TP este tema, así que voy directamente a la información de MQ.

Estuve viendo un par de links sobre Priorities en Message Queueing, y encontré algo de info y ejemplos interesantes que te van a servir.

Antes que nada, no confundirse los ejemplos que andan dando vueltas echos en Visual Basic o C#, con ejemplos en C++. No van a andar ni a ganchos, y las bibliotecas se usan de manera distinta.

Las invocaciones a las bibliotecas y los using para los namespace serían los siguientes:

#using <system.dll>
#using <system.messaging.dll>

using namespace System;
using namespace System::Messaging;



Una cosa más a tener en cuenta: Los ejemplos no compilan si no se pasa como argumento '/clr' al Compiler, es decir,
si no se habilita el Common Language Support.

settints_CLR_mq.png


Y aquí, los ejemplos funcionando. La Priority se le setea a un Message antes de ser enviado:


#using <system.dll>
#using <system.messaging.dll>

using namespace System;
using namespace System::Messaging;

/// <summary>
/// Provides a container class for the example.
/// </summary>
ref class MyNewQueue
{
//**************************************************
// Sends a string message to a queue.
//**************************************************
public:
void SendMessage( MessagePriority priority, String^ messageBody )
{
// Connect to a queue on the local computer.
MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );

// Create a new message.
Message^ myMessage = gcnew Message;
if ( priority > MessagePriority::Normal )
{
myMessage->Body = "High Priority: {0}",messageBody;
}
else
{
myMessage->Body = messageBody;
}

// Set the priority of the message.
myMessage->Priority = priority;

// Send the Order to the queue.
myQueue->Send( myMessage );

return;
}

//**************************************************
// Receives a message.
//**************************************************
void ReceiveMessage()
{
// Connect to the a queue on the local computer.
MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );

// Set the queue to read the priority. By default, it
// is not read.
myQueue->MessageReadPropertyFilter->Priority = true;

// Set the formatter to indicate body contains a String^.
array<Type^>^ p = gcnew array<Type^>(1);
p[ 0 ] = String::typeid;
myQueue->Formatter = gcnew XmlMessageFormatter( p );
try
{
// Receive and format the message.
Message^ myMessage = myQueue->Receive();

// Display message information.
Console::WriteLine( "Priority: {0}",
myMessage->Priority );
Console::WriteLine( "Body: {0}",
myMessage->Body );
}
catch ( MessageQueueException^ )
{
// Handle Message Queuing exceptions.
}
// Handle invalid serialization format.
catch ( InvalidOperationException^ e )
{
Console::WriteLine( e->Message );
}

// Catch other exceptions as necessary.

return;
}
};

//**************************************************
// Provides an entry point into the application.
//
// This example sends and receives a message from
// a queue.
//**************************************************
int main()
{
// Create a new instance of the class.
MyNewQueue^ myNewQueue = gcnew MyNewQueue;

// Send messages to a queue.
myNewQueue->SendMessage( MessagePriority::Normal, "First Message Body." );
myNewQueue->SendMessage( MessagePriority::Highest, "Second Message Body." );

// Receive messages from a queue.
myNewQueue->ReceiveMessage();
myNewQueue->ReceiveMessage();

return 0;
}


Más info:
Enumeration de Message Priorities: http://msdn.microsoft.com/en-us/library/system.messaging.messagepriority.aspx
Más sobre System Message Priorities: http://msdn.microsoft.com/en-us/library/system.messaging.message.priority%28VS.71%29.aspx


Saludos, y espero que te sirva.
Cualquier cosa, lo seguimos viendo.

Matías Dumrauf
--
Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a c-t...@googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
c-talks+u...@googlegroups.com
settints_CLR_mq.png

Gaston J. Sosa

unread,
Oct 12, 2010, 1:36:33 PM10/12/10
to c-t...@googlegroups.com

Jo jo, muchas gracias, voy a procesar la info juntarlo con lo que tengo y comento sumo o resto xD.

 

Gaston.

__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 5524 (20101012) __________

 

ESET NOD32 Antivirus ha comprobado este mensaje.

 

http://www.eset.com



__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 5524 (20101012) __________
image001.png
Reply all
Reply to author
Forward
0 new messages