Voici quelques moyens simples qui pourraient vous aider à traiter avec succès le problème de flux msdn win32.
Approuvé : Fortect
- 4 minutes pour la lecture.
L’offre crée un nouvel emplacement pour le processus. Le créateur du flux n’a besoin d’incorporer que l’adresse de préfixe de départ que le nouveau flux régulier doit utiliser. Typiquement, l’adresse de départ est vers créer une fonction définie dans l’ordinateur modèle (voir ThreadProc pour plus d’informations). Cette fonction en prend une simple et chacun de nos paramètres se voit attribuer une valeur DWORD. Le processus a peut potentiellement créer plusieurs threads qui exécutent simultanément la même fonction.
Vous trouverez ci-dessous l’exemple simple de droite montrant comment créer un nouveau thread génial, qui à son tour exécute la MyThreadFunction
disposée localement.
Le thread de buzzer applique la fonction WaitForMultipleObjects pour continuer chaque élément jusqu’à ce que les threads de travail soient terminés. Le contact avec le fil se bloque alors qu’il s’y attend réellement ; Pour maintenir le traitement, le thread appelant utilise généralement WaitForSingleObject et attend chaque signal d’un thread de travail vers son objet Wait. Notez le fait que les experts soutiennent que si vous fermez actuellement leur descripteur de workflow avant de fermer le site, cela ne mettra certainement pas fin au flux d’utilisateurs. Cependant, la reprise n’est pas disponible pour une utilisation dans les appels de performances ultérieurs.
#include #include #include #définir MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Un exemple concernant une structure de données personnalisée pour les voies d'eau utilisées.// Ceci est passé à partir d'un pointeur vide, la mâchoire tombante, cela pourrait être n'importe quelle donnée comme 1 idée// peut être passé dans une suggestion nulle (LPVOID).typedef struct MyData int val1; int val2; MYDONNEES, * PMEINEDATA;int_tmain() PMYDATA pDataArray [MAX_THREADS] ; DWORD dwThreadIdArray [MAX_THREADS] ; GESTION hThreadArray [MAX_THREADS] ; // Créer MAX_THREADS threads de travail. pour (int lorsque i = 0; i val1 implique i; pDataArray [i] -> val2 = maintenant i + 100 ; // Crée tous les threads pour démarrer l'exécution. hThreadArray [i] est égal à CreateThread ( NULL, // Restaurer les attributs de sécurité 2, // utiliser la pile standard pour toutes les tailles MyThreadFunction, // soigneusement le nom derrière la fonction pDataArray [i], // déclaration du rôle du thread 0, // utilise les indicateurs de construction par défaut & dwThreadIdArray [i]); // donne l'identifiant de la ligne // Vérifie généralement la valeur de retour pour le succès. // CreateThread, qu'il échoue ou non, se termine. // Cela doit s'assurer d'effacer automatiquement l'esprit du thread et. avec case (hThreadArray [i] == NULL) ErrorHandler (TEXTE ("CreateThread")); Routine de sortie (3) ; // fin de tout le cycle de création du thread principal. // Attendez que tous les threads se terminent. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Ferme de nombreux threads pour que le processus alloue de la mémoire libre. comme pour (int i = 0; i val1, pDataArray-> val2) ; StringCchLength (msgBuf, BUF_SIZE, & cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize, & dwChars, NULL); Renvoie 0 ; void ErrorHandler (LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, ZÉRO, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL); // Affiche des messages sur une erreur. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (vide) forme du corps (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) - sizeof (TCHAR), TEXTE ("% s n'a pas pu atteindre% d:% s"), lpszFunction, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT ("Erreur"), MB_OK); // Allocation libre de l'erreur par buffer. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
La main d’œuvre MyThreadFunction
évite d’utiliser le runtime C (CRT) car ses fonctions ne sont probablement pas des threads à faible risque, surtout si vous n’utilisez pas ce CRT multithread. Si vous souhaitez utiliser la fonction In crt the perfect ThreadProc
, utilisez la fonction _beginthreadex à la place.
Approuvé : Fortect
Fortect est l'outil de réparation de PC le plus populaire et le plus efficace au monde. Des millions de personnes lui font confiance pour assurer le fonctionnement rapide, fluide et sans erreur de leurs systèmes. Avec son interface utilisateur simple et son puissant moteur d'analyse, Fortect détecte et corrige rapidement un large éventail de problèmes Windows, de l'instabilité du système et des problèmes de sécurité à la gestion de la mémoire et aux goulots d'étranglement des performances.
Il était généralement risqué de transmettre l’adresse d’une variable locale absolue utile si le thread de création part avant le nouveau thread, car l’indice devient invalide. À la place, transmettez une alerte de mémoire allouée dynamiquement ou laissez le thread de développement actuel attendre la fin de la nouvelle liaison. Les données peuvent être transmises du flux de création à votre flux de remplacement à l’aide de variables globales. En tant que , il est généralement nécessaire de synchroniser toutes les connexions entre plusieurs threads. Pour plus d’informations via la synchronisation, consultez Exécution de la synchronisation multithread .
Le créateur d’un thread peut utiliser les arguments CreateThread pour spécifier :
- Techniques de sécurité pour la gestion du nouvel emplacement. Ces éléments de sécurité incluent le numéro d’identification personnel d’héritage, qui dépend du fait que le descripteur peut effectivement provenir de processus enfants appris. Les fonctionnalités de sécurité incluent également un tout nouveau descripteur de sécurité que le système utilise pour effectuer le travail, des contrôles d’accès sur toutes les utilisations ultérieures de tous les threads bloqués avant d’accorder l’accès.
- La pile fondamentale, qui fait référence à la taille du nouveau thread. La sommation des threads est par conséquent allouée dans l’espace mémoire du processus ; La stratégie augmentera sans aucun doute la pile selon les besoins et, par conséquent, la désallouera à chaque fois que le thread se terminera. Pour plus d’informations, consultez Taille de la pile de threads .
Accélérez les performances de votre ordinateur dès maintenant avec ce simple téléchargement.
Le fil créateur doit fournir une adresse d’enregistrement de voiture de code pour démarrer le fil de débutant. Habituellement, l’adresse de début spécifique est le nom de l’élément le plus important, défini dans le code (voir ThreadProc pour plus d’informations). Cette fonction prend chaque paramètre et renvoie une valeur DWORD.
_Beginthread et aussi , _beginthreadex Fonctions Le système alloue du temps CPU à chaque thread individuel afin que tous les threads puissent fonctionner simultanément dans un processus absolu. _beginthread, et à cette fin _beginthreadex, sont similaires à la fonction CreateThread de l’API Win32, mais ont les versions suivantes : Ils initialisent certains problèmes avec la bibliothèque d’exécution C.
L’appel WaitForSingleObject() retient qu’un objet soit atteint pour stimuler sa disponibilité. En d’autres termes, la procédure offre un meilleur service au thread et attend que ce thread se termine. Les threads créés avecprincipe() s’arrêteront une fois la ligne principale terminée.