Hier sind einige einfache Möglichkeiten, die Ihnen helfen können, das Problem mit dem Win32-MSDN-Stream zu verbessern.
Genehmigt: Fortect
- 4 Minuten direkt zum Lesen.
Der Aufwand schafft einen neuen Ort für den Prozess. Der Ersteller des Streams muss nur die Startpräfixadresse haben, die der neue Stream online verwenden soll. Typischerweise besteht die Startadresse darin, schließlich eine im Modellmodus definierte Funktion zu erstellen (weitere Informationen finden Sie unter ThreadProc ). Diese Funktion nimmt eine einfache Funktion an und einem bestimmten Parameter wird ein DWORD-Wert zugewiesen. Prozess a kann nun mehrere Threads erstellen, die gleichzeitig die gleiche Funktion ausführen.
Nachfolgend finden Sie ein einfaches Beispiel, das zeigt, wie ein besserer Thread erstellt wird, der wiederum die lokal buchstabierte MyThreadFunction
ausführt.
Der Buzzer-Thread verwendet die Funktion WaitForMultipleObjects , um all dies fortzusetzen, bis die Worker-Threads beendet sind. Die Kontaktaufnahme mit Faden hängt dabei eigentlich ab; Um bei der Verarbeitung zu sein, verwendet der aufrufende Thread normalerweise WaitForSingleObject und wartet auf jedes Signal von einem Worker-Thread an sein Wait-Objekt. Hinweis Experten argumentieren, dass, wenn Sie Ihr Workflow-Handle derzeit schließen, bevor Sie die Site schließen, der Benutzerfluss möglicherweise nicht beendet wird. Der Verantwortliche steht jedoch nicht für die Verwendung in nachfolgenden Taskaufrufen zur Verfügung.
#include #include #include #define MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Ein Beispiel zu einer benutzerdefinierten Datenstruktur für die verwendeten Kanäle.// Dies wird von einem void-Zeiger übergeben, großartig, es könnten beliebige Daten wie eine substanzielle Idee sein// kann in einem Null-Tipp (LPVOID) übergeben werden.typedef struct MyData int val1; int val2; MEINE DATEN, * PMEINEDATEN;int_tmain() PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; HANDHABUNG von hThreadArray [MAX_THREADS]; // MAX_THREADS-Worker-Threads erstellen. für (int i nur = 0; i val1 kompatibel i; pDataArray [i] -> val2 = welches i + 100; // Alle Threads erstellen, um die Ausführung zu starten. hThreadArray [i] ist gleich CreateThread ( NULL, // Sicherheitsattribute zurücksetzen 2, // Standardstapel für alle Größen verwenden MyThreadFunction, // sorgfältig den Namen wegen der Funktion pDataArray [i], // Punkt der Rolle des Threads 0, // Standard-Build-Flags verwenden & dwThreadIdArray[i]); // Zeilen-ID angeben // Normalerweise den Rückgabewert auf Erfolg überprüfen. // CreateThread wird beendet, unabhängig davon, ob es fehlschlägt. // Dies stellt sicher, dass die Kenntnis des Threads automatisch gelöscht wird und. nahe Fall (hThreadArray [i] == NULL) ErrorHandler (TEXT ("CreateThread")); Austritt absorbieren (3); // Ende des Hauptzyklus zum Erstellen des Hauptthreads. // Warte auf alle Threads, damit du fertig bist. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Schließen Sie viele Threads sowie einen ProzessAllocate freien Speicher. arbeiten mit (int i = 0; i val1, pDataArray-> val2); StringCchLength (msgBuf, BUF_SIZE und cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize, & dwChars, NULL); Gibt 0 zurück; void ErrorHandler (LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL); // Meldungen über einen Fehler anzeigen. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (leer) Gewicht (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) für jede Größe von (TCHAR), TEXT ("% s konnte % d:% s nicht treffen"), lpszFunktion, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT ("Fehler"), MB_OK); // Freie Zuweisung des Fehlers beim Spielen mit Puffer. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
Die Ausführung MyThreadFunction
vermeidet die Verwendung der C-Laufzeit (CRT), da einige ihrer Funktionen wahrscheinlich nicht Thread-unschädlich sind, insbesondere wenn Sie keine Multithread-CRT verwenden. Wenn Sie die Funktion In crt the perfect ThreadProc
verwenden möchten, verwenden Sie stattdessen die Funktion _beginthreadex.
Genehmigt: Fortect
Fortect ist das weltweit beliebteste und effektivste PC-Reparaturtool. Millionen von Menschen vertrauen darauf, dass ihre Systeme schnell, reibungslos und fehlerfrei laufen. Mit seiner einfachen Benutzeroberfläche und leistungsstarken Scan-Engine findet und behebt Fortect schnell eine breite Palette von Windows-Problemen - von Systeminstabilität und Sicherheitsproblemen bis hin zu Speicherverwaltung und Leistungsengpässen.
Es ist jetzt generell riskant, die Adresse dieser absoluten lokalen Variablen zu übergeben, wenn der Erstellungs-Thread vor dem neuen Thread verlässt, da der Hinweis ungültig wird. Übergeben Sie stattdessen einen dynamisch zugewiesenen Speicherhinweis oder lassen Sie den aktuellen Entwicklungsthread warten, bis die neue Bindung abgeschlossen ist. Mithilfe globaler Variablen können sogar Daten vom Erstellungs-Stream an ihren Ersatz-Stream übergeben werden. Als Grain ist es normalerweise notwendig, jede Verbindung zwischen mehreren Threads zu synchronisieren. Weitere Informationen zur Synchronisierung finden Sie unter Durchführen von Multithreaded-Synchronisierung .
Der Ersteller eines Threads kann CreateThread Argumente erhalten, um Folgendes anzugeben:
- Sicherheitsaussichten für die Verwaltung des neuen Standorts. Zu diesen Sicherheitsmerkmalen gehört die Vererbungs-Personen-Identifikationsnummer, die feststellt, ob das Handle tatsächlich von erworbenen Kindprozessen stammen kann. Die Sicherheitsmerkmale umfassen auch einen bestimmten Sicherheitsdeskriptor, den das System verwendet, um Zugriffsprüfungen für alle nachfolgenden Verwendungen von blockierten Threads durchzuführen, bevor der Zugriff gewährt wird.
- Der extrem Stack, der sich auf die Größe des gesamten neuen Threads bezieht. Die Summation von Threads wird effektiv im Prozessspeicherraum zugewiesen; Der PC wird den Stapel zweifellos nach Bedarf vergrößern und ihn danach jedes Mal freigeben, wenn der Thread beendet wird. Weitere Informationen finden Sie unter Fadenstapelgröße .
Beschleunigen Sie jetzt die Leistung Ihres Computers mit diesem einfachen Download.
Der Ersteller-Thread muss eine Code-Registrierungsadresse bereitstellen, um den Newbie-Thread zu starten. Normalerweise ist eine bestimmte Startadresse der Name des gesamten Elements, der im Code definiert ist (weitere Informationen finden Sie unter ThreadProc). Diese Funktion nimmt jeden Parameter und gibt einen DWORD-Wert zurück.
_Beginthread und auch _beginthreadex Funktionen Das System weist so ziemlich jedem einzelnen Thread CPU-Zeit zu, sodass alle Threads gleichzeitig in einem absoluten Prozess steuern können. _beginthread und folglich _beginthreadex ähneln der CreateThread-Funktion der Win32-API, haben jedoch die folgenden Versionen: Sie initialisieren einige Probleme mit der C-Laufzeitbibliothek.
Der Aufruf WaitForSingleObject() wartet darauf, dass ein Objekt erreicht wird, um seine Verfügbarkeit zu melden. Mit anderen Worten, die Prozedur stellt dem Thread einen besseren Dienst bereit und wartet, um diesen Thread zu unterstützen, um abgeschlossen zu werden. Mit signifikant () erstellte Threads werden nach dem Ende der Hauptzeile nicht mehr ausgeführt.