Multithreading: Encerrando segmentos
Duas situações normais causam um thread encerrar: a função controle sai ou o thread não é permitido executar para conclusão.Se um processador de texto usado um thread para impressão em segundo plano, a função controlar seria encerrado normalmente se impressão concluída com êxito.Se o usuário deseja cancelar a impressão, no entanto, o segmento de impressão em segundo plano tem encerrado prematuramente.Este tópico explica como implementar cada situação e como obter o código de saída de um thread após ele termina.
Término de Thread normal
Encerramento prematuro de Thread
Recuperar o código de saída de um segmento
Término de Thread normal
Um thread de trabalho, o término de thread normal é simple: a função controle de sair e retornar um valor que indica o motivo do término.Você pode usar o AfxEndThread função ou um return instrução.Normalmente, 0 significa conclusão bem-sucedida, mas que é você.
Para um segmento de interface do usuário, o processo é simple assim: de dentro do thread da interface do usuário, chamada PostQuitMessage na Windows SDK.O único parâmetro que PostQuitMessage leva é o código de saída do segmento.Para threads de trabalho, 0 normalmente significa conclusão bem-sucedida.
Encerramento prematuro de Thread
Encerrar um thread prematuramente é quase tão simple: chamada AfxEndThread de dentro do thread.Passe o código de saída desejado como o único parâmetro.Isso interrompe a execução do thread, desaloca pilha do thread, desconecta todas as DLLs anexadas ao thread e exclui o objeto de segmento de memória.
AfxEndThreaddeve ser chamado de dentro do segmento a ser finalizado.Se você quiser encerrar um segmento de outro segmento, você deve configurar um método de comunicação entre dois segmentos.
Recuperar o código de saída de um segmento
Para obter o código de saída o operador ou o segmento de interface do usuário, chame o GetExitCodeThread função.Para obter informações sobre esta função, consulte o Windows SDK.Essa função usa o identificador para o segmento (armazenado na m_hThread membro de dados de CWinThread objetos) e o endereço de um DWORD.
Se o segmento ainda está ativo, GetExitCodeThread coloca STILL_ACTIVE no fornecido DWORD endereço; Caso contrário, o código de saída é colocado nesse endereço.
Recuperar o código de saída de CWinThread objetos leva uma etapa extra.Por padrão, quando um CWinThread segmento termina, o objeto thread é excluído.Isso significa que você não pode acessar o m_hThread membro de dados porque o CWinThread objeto não existe mais.Para evitar essa situação, siga um destes procedimentos:
Definir o m_bAutoDelete membro dados para FALSE.Isso permite que o CWinThread objeto sobrevivam após o thread foi encerrado.Você pode acessar o m_hThread membro de dados após o thread foi encerrado.Se você usar essa técnica, no entanto, você é responsável por destruir o CWinThread porque a estrutura não excluirá automaticamente-lo para você.Este é o método preferencial.
Armazene o identificador do segmento separadamente.Depois que o segmento é criado, copie o m_hThread membro de dados (usando :: DuplicateHandle) a outra variável e acessá-lo através dessa variável.Dessa forma, o objeto é excluída automaticamente quando ocorre rescisão e você ainda pode descobrir por que o segmento é encerrado.Tenha cuidado para que o thread não encerra antes você pode duplicar o identificador.A maneira mais segura de fazer isso é passar CREATE_SUSPENDED para AfxBeginThread, armazenar o identificador e retomar o thread chamando ResumeThread.
O método permite determinar por que um CWinThread objeto terminado.