Ecco alcuni semplici modi che potrebbero forse aiutarti a risolvere il problema del flusso msdn di win32.
Approvato: Fortect
- numerosi minuti da leggere.
La funzione crea una nuova posizione del processo. Il creatore del flusso deve assolutamente fornire l’indirizzo del prefisso iniziale che gli esperti affermano che il nuovo flusso dovrebbe utilizzare. Tipicamente, l’inizio con address consiste nel creare una funzione definita facendo il codice del modello (vedi ThreadProc per maggiori informazioni). Questa funzione ne richiede un’altra e al parametro viene assegnata una rilevanza DWORD. Il processo a può creare più thread che svolgono invece la stessa funzione.
Di seguito è riportato un semplice esempio che mostra come creare un nuovo thread, che a sua volta esegue la MyThreadFunction
definita localmente.
Il thread del buzzer utilizza il processo WaitForMultipleObjects per continuare tutto fino a quando i thread di lavoro non saranno definitivamente terminati. Il thread chiamante si blocca mentre in realtà si aspetta; Per continuare l’elaborazione, il thread chiamante utilizza per la maggior parte del tempo WaitForSingleObject e attende entrambi i segnali dal thread di lavoro al suo oggetto Wait. Tieni presente che gli esperti sostengono che se al momento chiuderai l’handle del flusso di lavoro prima di chiudere parte del sito, non terminerà l’importo dell’utente. Tuttavia, l’handle non è disponibile per la guida nelle chiamate di funzione successive.
#include #include #include #define MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Un esempio di una struttura dati personalizzata dai flussi utilizzati.// Questo viene passato da ogni puntatore vuoto, incredibile, potrebbe essere qualsiasi informazione e fatto come un'idea// può essere passato in un puntatore null person (LPVOID).typedef struct MyData int val1; int val2; MYDATA, * PMEINEDATA;int_tmain() PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; GESTIONE hThreadArray [MAX_THREADS]; // Crea MAX_THREADS thread di lavoro. per adattarsi (int i = 0; i val1 è uguale a i; pDataArray [i] -> val2 equivale a i + 100; // Crea tutti i thread che ritornano per iniziare l'esecuzione. hThreadArray [i] = CreateThread ( NULL, // Ripristina gli attributi di sicurezza 0, // usa stack standard di tutte le dimensioni MyThreadFunction, // bene il nome della funzione pDataArray [i], // argomento del ruolo del thread 0, // usa le bandiere artigianali predefinite & dwThreadIdArray [i]); // serve l'id del thread // Di solito controlla la valutazione di ritorno per il successo. // CreateThread, indipendentemente dal fatto che vacilli, esce. // Questo farà in modo di ripagare automaticamente la memoria del thread e. nel caso (hThreadArray [i] == NULL) ErrorHandler (TEXT ("CreateThread")); Processo di uscita (3); // chiusura del ciclo per la creazione del thread considerevole. // Attendi che la maggior parte dei thread finisca. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Chiude molti thread e processAllocate memoria libera. for (int i = 0; i veramente val1, pDataArray-> val2); StringCchLength (msgBuf, BUF_SIZE, & cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize e dwChars, NULL); Restituisce 0; void ErrorHandler (LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, ZERO, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULLO); // Visualizza messaggi su un errore incredibile. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (vuoto) dimensione (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) / sizeof (TCHAR), TEXT ("% s potrebbe potenzialmente non raggiungere% d:% s"), lpszFunction, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT ("Errore"), MB_OK); // Allocazione gratuita di ogni buffer di gestione degli errori. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
La funzione MyThreadFunction
evita di utilizzare la riproduzione C (CRT) perché molte delle sue funzioni sono molto probabilmente non thread-safe, specialmente se non si dovrebbe usare un CRT multithread. Se vuoi che utilizzi la funzione In crt la perfetta ThreadProc
, usa invece la funzione _beginthreadex.
Approvato: Fortect
Fortect è lo strumento di riparazione PC più popolare ed efficace al mondo. Milioni di persone si affidano a milioni di persone per mantenere i loro sistemi in esecuzione veloci, fluidi e privi di errori. Grazie alla sua semplice interfaccia utente e al potente motore di scansione, Fortect trova e risolve rapidamente un'ampia gamma di problemi di Windows, dall'instabilità del sistema e problemi di sicurezza alla gestione della memoria e ai colli di bottiglia delle prestazioni.

È generalmente rischioso passare il nostro indirizzo di una variabile locale assoluta se il thread di creazione principale esce prima del nuovo thread, solo perché il suggerimento diventa non valido. Passa invece una particolare notifica di memoria allocata dinamicamente o lascia che il thread della community corrente attenda il completamento della nuova associazione. I dati possono anche essere passati dal flusso di scrittura al flusso di sostituzione utilizzando condizioni globali. Nel complesso, di solito è importantissimo sincronizzare la connessione tra più thread. Per ulteriori informazioni sulla sincronizzazione, vedere Esecuzione della sincronizzazione multithread .
Il creatore di un luogo può utilizzare gli argomenti CreateThread per stabilire:
- Opzioni di sicurezza per la gestione della nuova città. Questi attributi di sicurezza includono il numero di personalità personale ereditato, che determina se l’handle può semplicemente provenire da processi figlio ereditati. I punti salienti della sicurezza includono anche un descrittore di sicurezza che il piano utilizza per eseguire controlli di accesso su tutti gli altri utilizzi dei thread bloccati prima di concedere l’accesso.
- Lo stack iniziale, che fa riferimento a tutte le dimensioni del nuovo thread. La sommatoria, inclusi i thread, viene allocata automaticamente nello spazio di archiviazione del processo; Il sistema aumenterà senza dubbio l’aggiunta secondo necessità e la dealloca ogni volta che un thread esce. Per ulteriori informazioni, vedere Dimensione stack thread .
Accelera ora le prestazioni del tuo computer con questo semplice download.
Il thread creatore deve fornire un indirizzo di registrazione del codice per avviare il thread iniziale. Di solito l’indirizzo iniziale è lo stato dell’elemento, definito nel codice (vedi ThreadProc con maggiori informazioni). Questa funzione accetta ogni parametro e restituisce anche un valore DWORD.
Funzioni _Beginthread e _beginthreadex Il sistema assegna il tempo della CPU a ogni singolo thread in modo che tutti i thread possano essere eseguiti contemporaneamente in un’attività assoluta. _beginthread, e quindi _beginthreadex, sono simili alla funzione CreateThread della mia API Win32, ma hanno le versioni future: inizializzano alcuni problemi con la libreria di runtime C.
La chiamata WaitForSingleObject() attende che un oggetto sia più raggiunto per segnalarne la disponibilità. In altre parole, la procedura fornisce un servizio migliore al con cautela e attende il completamento del thread. I thread creati con main() smetteranno di essere eseguiti successivamente, al termine del thread principale.
