Multithreading: Terminação de segmentos

Duas situações normais, fazer com que a finalização do segmento: a função de controle sai ou o segmento não pode ser executado até a conclusão. Se um processador de texto usado um thread para impressão em segundo plano, a função controlar encerraria normalmente se imprimindo concluído com êxito. Se o usuário deseja cancelar a impressão, no entanto, o segmento de impressão do plano de fundo tem encerrado prematuramente. Este tópico explica como implementar cada situação e como obter o código de saída de um thread depois que ele encerra.

  • Finalização normal de Thread

  • Encerramento prematuro de Thread

  • Recuperando o código de saída de um Thread.

Finalização normal de Thread

Para um segmento de trabalho, a finalização do segmento normal é simple: A função de 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 a conclusão bem-sucedida, mas que é sua.

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 a conclusão com êxito.

Encerramento prematuro de Thread

Encerrar um thread prematuramente é quase tão simple: Chame 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 a pilha do thread, desconecta todas as DLLs anexadas ao segmento 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.

Recuperando o código de saída de um Thread.

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 essa função, consulte a 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 thread ainda está ativo, GetExitCodeThread coloca STILL_ACTIVE em fornecido DWORD endereço; Caso contrário, o código de saída é colocado nesse endereço.

Recuperando o código de saída de CWinThread objetos leva a 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 o membro de dados porque a CWinThread objeto não existe mais. Para evitar essa situação, siga um destes procedimentos:

  • Definir o m_bAutoDelete o membro de dados para FALSE. Isso permite que o CWinThread objeto sobreviva depois que o thread foi encerrado. Você pode acessar o m_hThread o membro de dados após o segmento foi finalizado. Se você usar essa técnica, no entanto, você é responsável por destruir a CWinThread porque a estrutura será não excluí-los automaticamente para você. Este é o método preferido.

  • Armazene o indicador do segmento separadamente. Depois que o segmento é criado, copie seu m_hThread o membro de dados (usando :: DuplicateHandle) a outra variável e acessá-lo através dessa variável. Dessa forma, o objeto será excluída automaticamente quando ocorre a terminação e você ainda pode descobrir por que o segmento terminou. Tenha cuidado para que o segmento não encerra antes que você pode duplicar o identificador. A maneira mais segura de fazer isso é passar CREATE_SUSPENDED para AfxBeginThread, a alça de armazenar e retomar o thread chamando ResumeThread.

O método lhe permite determinar por que uma CWinThread objeto terminado.

Consulte também

Referência

_endthread, _endthreadex

_beginthread, _beginthreadex

ExitThread

Conceitos

Multithreading com C++ e MFC