Compartilhar via


Multithreading: Terminação de segmentos

Duas situações normais causam um thread terminar: a função controle sai ou o thread não tem permissão para executar a finalização.Se um processador de texto usado um thread para plano de fundo imprimindo, a função controlar seria terminar normalmente se a impressão foi concluído com êxito.Se o usuário deseja cancelar a impressão, no entanto, o thread de impressão em segundo plano tem seja finalizada prematuramente.Este tópico explica como implementar cada situação e como obter o código de sair de um thread após ele ser concluído.

  • Normal thread terminação

  • Término prematuro thread

  • Recuperando o código de sair de um thread

Normal thread terminação

Para um thread de trabalho, finalização normal de thread é simples: A função controle de sair e retornar um valor que indica o motivo do término.Você pode usar ambos o AfxEndThread função ou um return demonstrativo. Normalmente, 0 significa a conclusão bem-sucedida, mas que é para você.

Para um segmento de interface do usuário, o processo é simplesmente sistema autônomo simples: de dentro do thread da interface do usuário, telefonar PostQuitMessage in the Windows SDK. O único parâmetro que PostQuitMessage leva é o código de sair do thread.sistema autônomo para threads de trabalho, 0 significa normalmente conclusão bem-sucedida.

Término prematuro thread

Encerrando um thread prematuramente é quase tão simples: De telefonarAfxEndThread de dentro do thread.Passe o código de sair desejado sistema autônomo 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 segmento de memória.

AfxEndThread deve ser chamado de dentro do thread a ser finalizado. Se você quiser terminar um thread outro thread, você deve configurar um método de comunicação entre os dois thread s.

Recuperando o código de sair de um thread

Para obter o código de sair do operador ou o thread de interface do usuário, chame o GetExitCodeThread função.Para obter informações sobre essa função, consulte o Windows SDK. Essa função usa a alça para o thread (armazenados no m_hThread membro de dados de CWinThread objetos) e o endereço de um DWORD.

Se o thread ainda estiver ativo, GetExitCodeThread places STILL_ACTIVE no fornecido DWORD endereço; caso contrário, o código de sair é colocado nesse endereço.

Recuperando o código de sair de CWinThread objetos leva uma etapa extra.Por padrão, quando um CWinThread segmento termina, o objeto de segmento é excluído. Isso significa que não é possível acesso o m_hThread membro de dados porque o CWinThread objeto não existe mais. Para evitar essa situação, siga um destes procedimentos:

  • conjunto o m_bAutoDelete membro de dados para FALSE.Isso permite que o CWinThread objeto sobreviver depois que o thread foi encerrado. Você pode então acesso o m_hThread membro de dados depois que o thread foi encerrado. Se você usar essa técnica, no entanto, você é responsável por destruir o CWinThread objeto porque a estrutura não excluirá automaticamente-lo para você. Este é o método preferencial.

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

Um dos métodos permite que você determine o motivo pelo qual um CWinThread objeto finalizado.

Consulte também

Conceitos

Multithreading com C++ e do MFC

Referência

_endthread, _endthreadex

_beginthread, _beginthreadex

ExitThread