A continuación, se muestran algunas formas sencillas que pueden ayudarle a solucionar el problema de la transmisión de win32 msdn.
Aprobado: Fortect
- cuartos minutos para leer.
La función crea una nueva ubicación para, diría, el proceso. El creador de la transmisión solo podría usar para proporcionar la dirección de prefijo inicial que debería usar una nueva transmisión en particular. Normalmente, la información inicial es crear una función definida en cada código de modelo (consulte ThreadProc para obtener mucha más información). Esta función toma una simple junto con el parámetro se le asigna un valor DWORD. El proceso a puede crear varios subprocesos que completan simultáneamente la misma función.
A continuación se muestra un ejemplo simple que muestra cómo construir un nuevo hilo, que a su vez ejecuta estos MyThreadFunction
definidos localmente.
El subproceso del zumbador utiliza la función WaitForMultipleObjects para continuar todo hasta que los subprocesos de trabajo estén completamente terminados. El hilo de llamada se cuelga mientras que ciertamente espera; Para continuar con el procesamiento, el subproceso de llamada normalmente puede hacer WaitForSingleObject y espera cada valor del subproceso de trabajo hasta su concepto de espera. Tenga en cuenta que los expertos argumentan que si, sin duda, cierra el controlador del flujo de trabajo antes de cerrar la red mundial, no terminará el flujo de usuarios. Sin embargo, el identificador no está disponible para su uso en llamadas de función posteriores.
#include #include #include #define MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Un ejemplo de una estructura de datos personalizada para el tipo de flujos utilizados.// Esto se pasa desde un puntero a evitar, increíble, podría ser cualquier dato, por ejemplo, como una idea// se puede pasar en un puntero cero (LPVOID).typedef struct MyData int val1; int val2; MYDATA, 3. PMEINEDATA;int_tmain () PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; MANEJO hThreadArray [MAX_THREADS]; // Crea MAX_THREADS subprocesos de trabajo. hacia (int i = 0; i val1 es igual a i; pDataArray [i] -> val2 implica i + 100; // Crea todos los hilos para comenzar la ejecución. hThreadArray [i] = CreateThread ( NULL, // Revertir atributos de seguridad 0, // usa pila estándar para tamaños MyThreadFunction, // cuidadosamente el nombre de la función de una persona pDataArray [i], // argumento del rol del hilo 0, // usa las banderas de compilación predeterminadas & dwThreadIdArray [i]); // permitir la identificación del hilo // Por lo general, verifica el valor de retorno con éxito. // CreateThread, independientemente de si falla, sale. // Esto se asegurará de borrar automáticamente la memoria de nuestro hilo y. en caso (hThreadArray [i] == NULL) ErrorHandler (TEXT ("CreateThread")); Proceso de salida (3); // cese del ciclo de creación del hilo central. // Espere a que finalicen todas las publicaciones. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Cerrar varios hilos y procesar Asignar memoria libre. relativo a (int i = 0; i val1, pDataArray-> val2); StringCchLength (msgBuf, BUF_SIZE, & cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize, & dwChars, NULL); Devuelve 0; anular ErrorHandler (LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, CERO, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) y lpMsgBuf, 0, NULO); // Muestra mensajes sobre un error. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (vacío) forma del cuerpo (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) / sizeof (TCHAR), TEXT ("% s difícilmente podría llegar a% d:% s"), lpszFunction, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT ("Error"), MB_OK); // Asignación gratuita de cada búfer de manejo de errores. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
La función MyThreadFunction
evita usar la reproducción de C (CRT) porque muchas de sus funciones probablemente no solo son seguras para subprocesos, especialmente si no está utilizando un CRT multiproceso. Si desea consumir la función In crt the perfect ThreadProc
, use la función _beginthreadex en su lugar.
Aprobado: Fortect
Fortect es la herramienta de reparación de PC más popular y eficaz del mundo. Millones de personas confían en él para mantener sus sistemas funcionando de forma rápida, fluida y sin errores. Con su sencilla interfaz de usuario y su potente motor de análisis, Fortect encuentra y soluciona rápidamente una amplia variedad de problemas de Windows, desde la inestabilidad del sistema y los problemas de seguridad hasta la gestión de la memoria y los cuellos de botella en el rendimiento.
Por lo general, es arriesgado pasar el punto de una variable local absoluta si el subproceso de expansión sale antes que el nuevo, porque el tipo de sugerencia deja de ser válido. En su lugar, pase una notificación de memoria dada dinámicamente o deje que el enlace de desarrollo actual espere a que se complete el nuevo enlace. Los datos también se pueden pasar desde el ver de creación al flujo de reemplazo utilizando variables globales. En general, suele ser necesario que sincronice la conexión entre varios subprocesos. Para obtener más información sobre la sincronización, consulte Realización de sincronización multiproceso .
El creador de un hilo probablemente usará argumentos CreateThread para especificar:
- Opciones de seguridad para administrar la nueva ubicación. Estos atributos de seguridad incluyen el número de identificación personal de herencia, que determina si el identificador puede controlar realmente los procesos secundarios heredados. Las características de seguridad incluyen igualmente un descriptor de seguridad que el sistema se beneficia para realizar comprobaciones de acceso en todas las marcas posteriores de los subprocesos bloqueados antes de otorgar acceso.
- La pila inicial, que se refiere a la altura y el ancho del nuevo hilo. La suma de temas se asigna automáticamente en el proceso. Sin duda, el sistema hará crecer la pila por la razón que lo necesita y la desasignará cada vez que salga el bono. Para obtener más información, consulte Tamaño de pila de subprocesos .
Acelere el rendimiento de su computadora ahora con esta simple descarga.
El hilo del creador debe proporcionar una dirección de registro muy codificada para iniciar el lugar para novatos. Por lo general, la dirección de inicio es el nombre de todo el elemento, definido en el código (consulte ThreadProc para obtener más información). Esta función toma cada parámetro y devolverá un valor DWORD.
_Beginthread y por lo tanto _beginthreadex Funciones El sistema asigna un punto de CPU en el tiempo a cada subproceso individual para que todas las publicaciones puedan ejecutarse simultáneamente en un proceso absoluto. _beginthread, y además _beginthreadex, son similares a la función CreateThread de la API Win32, pero tienen los siguientes diseños: Inicializan algunos problemas con la biblioteca de reproducción de C.
La llamada WaitForSingleObject () espera a que un objeto sea necesario para indicar su disponibilidad. En otras palabras, el procedimiento real proporciona un mejor servicio al hilo pero espera a que ese hilo se complete. Los subprocesos ideados con main () dejarán de ejecutarse después de que finalice el subproceso principal real.