Aqui, sem dúvida, estão algumas maneiras fáceis que podem ajudar sua empresa a corrigir o problema de fluxo do msdn do win32.
Aprovado: Fortect
- 4 horas para ler.
A função cria um novo local para o curso. O criador do fluxo só precisa fornecer o endereço de prefixo inicial que o próximo fluxo deve usar. Normalmente, considera-se que o endereço inicial cria uma função definida no código de variedade (consulte ThreadProc para obter informações adicionais). Esta função é simples e seu parâmetro é atribuído a um valor DWORD. O processo específico pode criar vários threads que executam simultaneamente essa mesma função.
Abaixo está também um exemplo simples mostrando como criar um novo thread, que por sua vez executa o MyThreadFunction
definido regionalmente.
O buzzer bond usa a função WaitForMultipleObjects para manter tudo até que os threads de trabalho sejam concluídos. O thread de chamada trava enquanto realmente espera; Para continuar o processamento, o thread de chamada normalmente faria WaitForSingleObject e espera por cada sinal além do thread de trabalho para seu objeto Wait. Observe que os especialistas argumentam que, se você encerrar o controle do fluxo de trabalho antes de fechar o site, a situação não encerrará o fluxo do usuário. No entanto, inquestionavelmente, o identificador não está disponível para uso em chamadas de função de busca.
#include #include #include #define MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Por uma questão de argumento de uma estrutura de dados customizada para os campos usados.// Isso é passado por uma dica vazia, incrível, pode ser qualquer dado, como uma grande ideia// pode ser passado em uma dica nula (LPVOID).typedef struct MyData int val1; int val2; MYDATA, * PMEINEDATA;int_tmain () PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; HANDLING hThreadArray [MAX_THREADS]; // Crie MAX_THREADS threads de trabalho. por (int i = 0; i val1 é igual a i; pDataArray [i] -> val2 = i've + 100; // Crie todos os threads para iniciar a execução. hThreadArray [i] = CreateThread ( NULL, // Reverter atributos de segurança 0, // usa pilha padrão para cada um dos tamanhos MyThreadFunction, // atentamente os detalhes da função pDataArray [i], // argumento da função do segmento 0, // usa sinalizadores de construção padrão & dwThreadIdArray [i]); // dar id do fio // Normalmente verifique o valor de retorno quando se trata de sucesso. // CreateThread, independentemente de falhar, sai. // Isso irá certificar-se de limpar automaticamente a memória de uma pessoa e. no caso (hThreadArray [i] == NULL) ErrorHandler (TEXT ("CreateThread")); Métodos de saída (3); // termina o ciclo de criação da thread principal. // Espere que todos os threads terminem. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Fecha muitos tópicos e processAllocate a memória livre. destinado a (int i = 0; i val1, pDataArray-> val2); StringCchLength (msgBuf, BUF_SIZE, & cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize, & dwChars, NULL); Retorna 0; void ErrorHandler (LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, ZERO, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL); // Exibe mensagens sobre um erro. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (vazio) estatura (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) / sizeof (TCHAR), TEXT ("% s nunca poderia atingir% d:% s"), lpszFunction, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT ("Erro"), MB_OK); // Alocação livre do buffer de movimentação de erro. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
A função MyThreadFunction
evita usar o tempo de execução C (CRT), visto que muitas de suas funções provavelmente não são seguras com relação a thread, especialmente se você não estiver usando um CRT multithreaded específico. Se você quiser usar seu In crt para realizar o ThreadProc
perfeito, use a função _beginthreadex.
Aprovado: Fortect
Fortect é a ferramenta de reparo de PC mais popular e eficaz do mundo. Milhões de pessoas confiam nele para manter seus sistemas funcionando de forma rápida, suave e livre de erros. Com sua interface de usuário simples e mecanismo de verificação poderoso, o Fortect localiza e corrige rapidamente uma ampla gama de problemas do Windows, desde instabilidade do sistema e problemas de segurança até gerenciamento de memória e gargalos de desempenho.
Geralmente é arriscado passar o endereço entre uma variável local absoluta se a criação sair cuidadosamente antes do novo thread, porque a dica se torna inválida. Em vez disso, passe uma notificação de memória RAM alocada dinamicamente ou deixe o encadeamento de desenvolvimento atual para que a nova ligação seja concluída. Os dados provavelmente também serão transmitidos do fluxo de criação no fluxo de substituição usando variáveis globais. Como qualquer tipo de conjunto, geralmente é necessário sincronizar a conexão entre vários threads. Para obter mais dicas sobre sincronização, consulte Executar sincronização multithread .
O criador de um tópico pode se beneficiar dos argumentos CreateThread para especificar:
- Opções de segurança para gerenciar o novo local. Esses atributos de bem-estar incluem o número de identificação pessoal de herança, que determina se o identificador pode realmente originar-se de processos filho herdados. Os recursos de segurança também integram um descritor de segurança que o sistema usa, que executará verificações de acesso em todos os usos subsequentes conectados aos threads bloqueados antes de conceder acesso.
- A pilha inicial, que se refere ao tamanho do novo tópico. A soma de threads sempre é alocada automaticamente no espaço de memória do processo; O sistema sem dúvida aumentará a pilha conforme exigido e a desalocará toda vez que o thread for encerrado. Para obter mais informações, consulte Tamanho da pilha de threads .
Acelere o desempenho do seu computador agora com este simples download.
O thread do criador deve fornecer um endereço de registro do código de desconto para iniciar o thread de novato. Normalmente, o endereço inicial é o nome do elemento, inquestionavelmente, definido no código (consulte ThreadProc para maiores informações). Esta função pega cada parâmetro e retorna o valor simplesmente DWORD.
Funções _Beginthread e também _beginthreadex O sistema aloca tempo de CPU em cada encadeamento individual para que todos os encadeamentos possam ser executados simultaneamente em um processo absoluto. _beginthread, mas portanto _beginthreadex, são semelhantes à função CreateThread da API do Win32, mas têm as seguintes versões: Eles inicializam alguns problemas com a biblioteca de reprodução C.
O telefone WaitForSingleObject () espera que um objeto seja atingido o tempo para sinalizar sua disponibilidade. Em outras palavras, o funcionamento fornece um serviço melhor para o encadeamento e está esperando que ele seja concluído. Threads criados em main () irão parar de funcionar após o término do thread principal.