CreateThread en C#: Creación y Manejo de Hilos
El uso de hilos es fundamental en la programación de sistemas y aplicaciones que requieren realizar múltiples tareas simultáneamente. La función CreateThread de kernel32.dll es una herramienta poderosa para crear hilos en aplicaciones de Windows. En este ejemplo, vamos a ver cómo podemos usar esta función en C# para crear un hilo y ejecutar código concurrentemente.
Descripción de CreateThread
CreateThreadLa función CreateThread se utiliza para crear un nuevo hilo en un programa. Su sintaxis en C (o C# mediante P/Invoke) es la siguiente:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // Atributos del hilo
DWORD dwStackSize, // Tamaño de la pila
LPTHREAD_START_ROUTINE lpStartAddress, // Dirección de la función que el hilo ejecutará
LPVOID lpParameter, // Parámetro que se pasa a la función
DWORD dwCreationFlags, // Flags de creación
LPDWORD lpThreadId // Identificador del hilo
);Argumentos:
lpThreadAttributes: Especifica un puntero a una estructura que define los atributos del hilo. Usualmente se pasaIntPtr.Zeropara usar los valores predeterminados.dwStackSize: Es el tamaño de la pila para el nuevo hilo. Si se pasa 0, se utilizará el tamaño predeterminado.lpStartAddress: Especifica la dirección de la función que será ejecutada por el hilo.lpParameter: Puntero a los parámetros que se pasan a la función del hilo. Si no hay parámetros, se pasaIntPtr.Zero.dwCreationFlags: Especifica los flags de creación del hilo (0 para crear un hilo en ejecución).lpThreadId: Devuelve el identificador del hilo creado.
Retorno:
Devuelve un handle para el hilo creado. Si la función falla, devuelve
IntPtr.Zero.
Uso de CreateThread en C#
CreateThread en C#En C#, podemos utilizar P/Invoke para invocar funciones de la API nativa de Windows, como CreateThread. A continuación, mostramos un ejemplo práctico en el que se crea un hilo utilizando CreateThread y se ejecuta un método en ese hilo.
Código en C#:
Explicación del Código:
Declaración del Delegado
ThreadProcDelegate:Primero definimos un delegado (
ThreadProcDelegate) que representa el tipo de método que se ejecutará en el hilo. Este delegado debe tener la misma firma que la función que se ejecutará en el hilo, en este caso,MiMetodo.
Importación de
CreateThread:Usamos P/Invoke para importar la función
CreateThreaddesde la bibliotecakernel32.dll. Esto nos permite llamar a esta función nativa de Windows directamente desde C#.
Creación del Hilo:
Llamamos a
CreateThreadpasando los parámetros adecuados:IntPtr.Zerose pasa para usar los valores predeterminados en los atributos del hilo y la pila.El delegado
MiMetodoes el que se ejecutará en el hilo.IntPtr.Zerose pasa porque no necesitamos parámetros adicionales para el hilo.0para losdwCreationFlags, lo que significa que el hilo se ejecutará inmediatamente.
Ejecución Concurrente:
El método
MiMetodose ejecuta en el hilo creado porCreateThread. Este método imprime los números del 0 al 4 con un retardo de un segundo entre cada impresión gracias aThread.Sleep(1000).
Esperar la Entrada del Usuario:
Dado que
CreateThreadcrea el hilo en segundo plano, la ejecución del hilo no detiene el flujo principal del programa. Por lo tanto, utilizamosConsole.ReadKey()para hacer una pausa y permitir que el usuario vea la salida del hilo antes de que la aplicación termine.
Last updated