Här är några enkla sätt som kanske hjälper dig att åtgärda problem med win32 msdn-strömning.
Godkänd: Fortect
- 4–5 minuter att läsa.
Funktionen skapar en ny plats när det gäller processen. Skaparen av strömmen behöver egentligen bara ange startprefixadressen som den nya strömmen ska använda. Vanligtvis är den ursprungliga adressen att skapa en funktion definierad i modellkoden (se ThreadProc för mer information). Denna funktion tar en enkel valfri och parametern tilldelas en DWORD-kostnad. Process a kan skapa flera trådar som oväntat utför samma funktion.
Nedan är ett enkelt exempel som visar hur det är dags att skapa en ny tråd, som i sin tur fungerar den lokalt definierade MyThreadFunction
.
Summertråden använder WaitForMultipleObjects visar resultat för att fortsätta allt tills arbetartrådarna verkligen är klara. Den ringande tråden hänger medan faktum är förväntar sig; För att fortsätta bearbetningen använder den anropande tråden runt WaitForSingleObject och väntar på en enskild signal från arbetartråden till dess Wait-objekt. Observera att experter hävdar att om man för närvarande stänger arbetsflödeshandtaget innan man stänger din webbplats, kommer det inte att avsluta användarflödet. Handtaget är dock inte tillgängligt för att aktiveras vid efterföljande funktionsanrop.
#inkludera #include #include #define MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Ett exempel på en anpassad datastruktur på de strömmar som används.// Detta skickas från en enorm tomrumspekare, otroligt, det kan vara vilken personlig information som helst som en idé// kan skickas i en specifik nollpekare (LPVOID).typedef struct MyData int val1; int val2; MYDATA, * PMEIEDATA;int_tmain () PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; HANTERA hThreadArray [MAX_THREADS]; // Skapa MAX_THREADS arbetstrådar. tillgänglig för (int i = 0; i val1 är lika med i; pDataArray [i] -> val2 innebär i + 100; // Skapa alla trådar för att verkligen börja köra. hThreadArray [i] = CreateThread ( NULL, // Återställ säkerhetsattribut 0, // använd standardstack när alla storlekar MyThreadFunction, // heltäckande namnet på funktionen pDataArray [i], // argument för trådens roll 0, // använd förvalda flaggor & dwThreadIdArray [i]); // betala tråd-id // Kontrollera vanligtvis returaffären för framgång. // CreateThread, oavsett om den vacklar, avslutas. // Detta kommer att se till att automatiskt se igenom trådens minne och. i fallet (hThreadArray [i] == NULL) ErrorHandler (TEXT ("CreateThread")); Avsluta processen (3); // sidan av cykeln för att skapa tråd nummer ett. // Vänta tills nästan alla trådar är klara. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Stäng många trådar och bearbeta Tilldela ledigt minne. för (int i = 0; val1, pDataArray-> val2); StringCchLength (msgBuf, BUF_SIZE, & cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize, & dwChars, NULL); Returnerar 0; void ErrorHandler (LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, NOLL, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL); // Visa meddelanden om ett fantastiskt fel. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (tom) storlek (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) / sizeof (TCHAR), TEXT ("% s kan mycket väl inte träffa% d:% s"), lpszFunction, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT ("Fel"), MB_OK); // Gratis tilldelning av deras felhanteringsbuffert. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
Funktionen MyThreadFunction
undviker att använda lärornas C (CRT) eftersom många av dess funktioner sannolikt inte är trådsäkra, speciellt om du inte använder en flertrådad CRT. Om du vill använda In crt den perfekta funktionen ThreadProc
, använd istället funktionen _beginthreadex.
Godkänd: Fortect
Fortect är världens mest populära och effektiva PC-reparationsverktyg. Det litar på miljontals människor för att hålla sina system igång snabbt, smidigt och felfritt. Med sitt enkla användargränssnitt och kraftfulla skanningsmotor hittar och fixar Fortect snabbt ett brett utbud av Windows-problem – från systeminstabilitet och säkerhetsproblem till minneshantering och prestandaflaskhalsar.
Det är generellt sett riskabelt att skicka för närvarande adressen till en absolut lokal variabel om skapande tråd avslutas innan den nya tråden, helt enkelt för att tipset blir ogiltigt. Skicka istället en specifik dynamiskt allokerad minnesavisering eller låt den nuvarande tillväxttråden vänta på att den nya bindningen är full. Data kan också överföras från den nya teknikströmmen till ersättningsströmmen med hjälp av globala regler. Som helhet behövs det vanligtvis för att synkronisera anslutningen mellan flera trådar. För mer information om synkronisering, se Utföra Flertrådssynkronisering .
Skaparen av en försiktig tråd kan använda CreateThread argument för att känna igen:
- Säkerhetsalternativ för att hantera den nya putten. Dessa säkerhetsattribut inkluderar arvets personliga individualitetsnummer, som avgör om handtaget absolut kan härröra från ärvda underordnade processer. Säkerhetsfaktorerna inkluderar också en säkerhetsdeskriptor som programvaran använder för att utföra åtkomstkontroller av all efterföljande användning av de blockerade trådarna innan återhämtning beviljas.
- Den initiala stacken, som refererar till storleken på den nya tråden. Summeringen kopplad till trådar allokeras automatiskt i processcram-utrymmet; Systemet kommer utan tvekan att växa högen efter behov och deallokera den varje gång den här tråden går ut. För mer information, se Trådstapelstorlek .
Snabba upp din dators prestanda nu med denna enkla nedladdning.
Skapartråden måste erbjuda dig en kodregistreringsadress för att starta den oerfarna tråden. Vanligtvis är startadressen tillverkaren av elementet, definierad i kod (se ThreadProc för mer information). Denna funktion tar varje parameter så returnerar ett DWORD-värde.
_Beginthread och _beginthreadex funktioner Systemet allokerar CPU-tid till varje enskild tråd så att bara trådar kan köras samtidigt i en absolut uppgift. _beginthread, och därför _beginthreadex, liknar den exakta Win32 API:s CreateThread-funktion, men har kort efter versionerna: De initierar vissa problem med C runtime-biblioteket.
Anropet WaitForSingleObject () väntar på att ett objekt ska växa för att nås för att signalera dess tillgänglighet. I andra uttryck ger proceduren bättre service till den noggrant och väntar på att tråden ska slutföras. Trådar skapade med huvudtråden () kommer att sluta fungera efter att huvudtråden är klar.