Hier zijn enkele eenvoudige manieren die u mogelijk kunnen helpen bij het oplossen van het win32 msdn-streamprobleem.
Goedgekeurd: Fortect
- houd rekening met te lezen minuten.
De functie creëert een nieuwe locatie die nodig is voor het proces. De maker van de stream hoeft uitsluitend het startprefixadres op te geven dat de nieuwe stream moet gebruiken. Meestal is het adres om een functie aan te maken die in de modelcode is gedefinieerd (zie ThreadProc voor meer informatie). Deze functie duurt een simpele en de parameter krijgt een DWORD-beoordeling. Proces a kan meerdere threads maken die tegelijkertijd dezelfde functie uitvoeren.
Hieronder ziet u een eenvoudig voorbeeld dat laat zien hoe u onderweg een nieuwe thread maakt, die op zijn beurt de lokaal gedefinieerde MyThreadFunction
uitvoert.
De buzzerthread gebruikt de WaitForMultipleObjects om alles voort te zetten totdat de worker-threads klaar lijken te zijn. De roepende draad hangt terwijl de waarheid wordt verwacht; Om door te gaan met verwerken, gebruikt de aanroepende thread meestal WaitForSingleObject en wacht op elk van hen een signaal van de worker-thread naar zijn Wait-object. Merk op dat experts beweren dat als families momenteel de workflow-handle sluiten voordat ze de algemene site sluiten, dit de gebruikerstoename niet zal beëindigen. De handle is echter niet beschikbaar voor gebruik in volgende functieaanroepen.
#include #include #include #define MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Een voorbeeld van een aangepaste datastructuur om de gebruikte streams te verkrijgen.// Dit is doorgegeven van een echte lege aanwijzer, ongelooflijk, het kunnen alle computerbestanden zijn, zoals een idee// kan worden doorgegeven in null pointer (LPVOID).typedef struct MijnGegevens int val1; int val2; MIJNGEGEVENS, * PMEINEGEGEVENS;int_tmain () PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; BEHANDELING hThreadArray [MAX_THREADS]; // Maak MAX_THREADS werkthreads. vanwege (int i = 0; i val1 is gelijk aan i; pDataArray [i] -> val2 is gelijk aan i + 100; // Maak alle threads van startuitvoering. hThreadArray [i] = CreateThread ( NULL, // Beveiligingskenmerken terugdraaien 0, // gebruik standaard stapel over alle formaten MyThreadFunction, // intelligent de naam van de functie pDataArray [i], // argument van de rol van de thread 0, // gebruik standaard assembleervlaggen & dwThreadIdArray [i]); // betaal thread-ID // Controleer meestal de werkelijke waarde van het rendement voor succes. // CreateThread, ongeacht of het hapert, wordt afgesloten. // Dit zorgt ervoor dat het geheugen van de thread automatisch wordt opgeschoond en opgeschoond. in het geval (hThreadArray [i] == NULL) ErrorHandler (TEXT ("CreateThread")); Exit-proces (3); // deel van de cyclus voor het maken van de benodigde thread. // Wacht tot bijna alle threads klaar zijn. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Sluit veel threads en verwerk Wijs vrij geheugen toe. voor (int i = 0; methode val1, pDataArray-> val2); StringCchLength (msgBuf, BUF_SIZE, & cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize, & dwChars, NULL); Retourneert 0; void ErrorHandler (LPTSTR lpszFunctie) FORMAT_MESSAGE_IGNORE_INSERTS, NUL, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL); // Geef berichten weer over een geweldige fout. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (leeg) formaat (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) / sizeof (TCHAR), TEXT ("% s zou niet op% d:% s moeten komen"), lpszFunctie, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT ("Fout"), MB_OK); // Gratis toewijzing van een foutafhandelingsbuffer. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
De MyThreadFunction
-functie vermijdt het gebruik van de C van teachings (CRT) omdat veel van zijn functies absoluut niet thread-safe zijn, vooral als er niet wordt overwogen om een multithreaded CRT te gebruiken. Als je de In crt de perfecte ThreadProc
functie wilt gebruiken, gebruik dan in plaats daarvan de _beginthreadex functie.
Goedgekeurd: Fortect
Fortect is 's werelds meest populaire en effectieve pc-reparatietool. Miljoenen mensen vertrouwen erop dat hun systemen snel, soepel en foutloos blijven werken. Met zijn eenvoudige gebruikersinterface en krachtige scanengine kan Fortect snel een breed scala aan Windows-problemen vinden en oplossen - van systeeminstabiliteit en beveiligingsproblemen tot geheugenbeheer en prestatieproblemen.
Het is over het algemeen riskant om elk van onze adressen van een absolute lokale variabele door te geven als de aanmaakthread vóór de nieuwe thread wordt afgesloten, alleen omdat de hint ongeldig wordt. Geef in plaats daarvan deze dynamisch toegewezen geheugenmelding door of laat de huidige ontwerpthread wachten tot de nieuwe binding is uitgevoerd. Gegevens kunnen ook worden doorgegeven van de leeftijdsgroepstream naar de vervangende stream met behulp van globale details. Als geheel is het meestal essentieel om de verbinding tussen meerdere threads te synchroniseren. Zie synchronisatie met meerdere threads uitvoeren voor meer informatie over synchronisatie.
De maker van een plaats kan CreateThread -argumenten gebruiken om jezelf een buget toe te wijzen:
- Beveiligingsopties voor het beheren van de nieuwe plaatsing. Deze beveiligingsattributen omvatten het overervings-persoonlijk acceptatienummer, dat bepaalt of de handle in werkelijkheid afkomstig kan zijn van geërfde onderliggende processen. De beveiligingsopties bevatten ook een beveiligingsdescriptor die het proces gebruikt om toegangscontroles uit te voeren op iedereen net na het gebruik van de geblokkeerde threads voordat het browsen wordt toegestaan.
- De initiële stapel, die ongetwijfeld verwijst naar de grootte van de nieuwe thread. De sommatie met behulp van threads wordt automatisch toegewezen in de procesherinneringsruimte; Het systeem zal ongetwijfeld de optelling naar behoefte uitbreiden en de toewijzing ongedaan maken telkens wanneer een nieuwe thread wordt afgesloten. Zie Grootte garenstapel voor meer informatie.
Versnel de prestaties van uw computer nu met deze eenvoudige download.
De thread voor de maker moet u een coderegistratieadres geven om de eerste thread te starten. Gewoonlijk is het startadres de identificatie van het element, gedefinieerd in code (zie ThreadProc voor meer informatie). Deze functie neemt elke parameter en retourneert een DWORD-waarde.
_Beginthread- en _beginthreadex-functies Het systeem wijst CPU-tijd toe aan elke afzonderlijke thread, zodat alle threads gelijktijdig in absolute stappen kunnen worden uitgevoerd. _beginthread, en dus _beginthreadex, lijken op de CreateThread-functie van elke Win32 API, maar maken gebruik van versies: ze initialiseren enkele problemen met de C runtime-bibliotheek.
De WaitForSingleObject () -aanroep wacht tot een object wordt bereikt om de beschikbaarheid ervan aan te geven. In andere vocalen biedt de procedure een betere service aan de band en wacht tot die draad is voltooid. Discussies die met main () zijn gemaakt, worden vervolgens niet meer uitgevoerd nadat de hoofdthread is voltooid.