Multithreading: Criando segmentos de trabalho
Um operador thread costuma ser usado para manipular tarefas de plano de fundo que o usuário não deve ter para aguardar para continuar usando o seu aplicativo.Tarefas, sistema autônomo impressão em segundo plano e de recálculo são mercadoria exemplos de segmentos de trabalho.Este tópico detalha as etapas necessárias para criar um thread de trabalho.Os tópicos incluem:
Iniciando o thread
Implementar a função de controle
Exemplo
Criar um thread de trabalho é uma tarefa relativamente simples.Apenas duas etapas são necessárias para obter seu thread em execução: implementar a função de controle e iniciando o thread.Não é necessário derivar uma classe de CWinThread.Você pode derivar uma classe se precisar de uma versão especial de CWinThread, mas não é necessário para a maioria dos segmentos de trabalho simples. Você pode usar CWinThread sem modificação.
Iniciar o thread
Há duas versões sobrecarregadas dos AfxBeginThread: uma para threads de interface do usuário e uma para threads de trabalho.Para iniciar a execução do thread de trabalho, telefonar AfxBeginThread, fornecendo as seguintes informações:
O endereço da função controlar.
O parâmetro a ser passada para a função de controle.
(Opcional) A prioridade desejada a thread.O padrão é a prioridade normal.Para obter mais informações sobre os níveis de prioridade disponível, consulte SetThreadPriority in the Windows SDK.
(Opcional) O dimensionar da pilha desejada para o thread.O padrão é a mesma pilha dimensionar sistema autônomo a criação de thread.
(Opcional) CREATE_SUSPENDED se desejar que o thread a ser criado em um estado suspenso.O padrão é 0 ou iniciar o thread normalmente.
(Opcional) Os atributos de segurança desejado.O padrão é o mesmo acesso sistema autônomo thread pai.Para obter mais informações sobre o formato dessas informações de segurança, consulte SECURITY_ATTRIBUTES in the Windows SDK.
AfxBeginThread cria e inicializa um CWinThread objeto para você, iniciá-lo e retorna seu endereço para que possa consultá-lo mais tarde. As verificações são feitas durante o procedimento para certificar-se de que todos os objetos estão liberados adequadamente caso de falha em qualquer parte da criação.
Implementar a função de controle
A função controle define o thread.Quando esta função é inserida, o thread se inicia e quando é encerrado, o segmento é encerrado.Esta função deve ter o seguinte protótipo:
UINT MyControllingFunction( LPVOID pParam );
O parâmetro é um único valor.O valor que a função recebe neste parâmetro é o valor foi passado para o construtor quando o objeto thread foi criado.A função de controle pode interpretar esse valor de qualquer maneira, que ele escolhe.Pode ser tratado sistema autônomo um valor escalar ou de um ponteiro para uma estrutura que contém vários parâmetros ou pode ser ignorado.Se o parâmetro se refere a uma estrutura, a estrutura pode ser usada não apenas para passar dados do chamador para o segmento, mas também para passar dados de volta do thread para o chamador.Se você usar como uma estrutura para passar dados de volta para o chamador, o segmento precisa notificar o chamador quando os resultados estão prontos.Para obter informações sobre a comunicação do thread de trabalho para o chamador, consulte Multithreading: Programação dicas.
Quando a função é encerrado, ele deverá retornar um UINT valor que indica o motivo do término.Normalmente, esse código de sair é 0 para indicar sucesso com outros valores indicando diferentes tipos de erros.Esta é puramente dependentes de implementação.Alguns segmentos podem manter contagens de uso de objetos e retornar o número corrente de usos do objeto.Para ver como os aplicativos podem recuperar esse valor, consulte Multithreading: Terminação de segmentos.
Há algumas restrições ao que você pode fazer em um programa multithread escrito com a biblioteca MFC.Para obter descrições sobre essas restrições e outras dicas sobre o uso de threads, consulte Multithreading: Programação dicas.
Exemplo da função de controle
O exemplo a seguir mostra como definir uma função de controle e usá-lo de outra parte do programa.
UINT MyThreadProc( LPVOID pParam )
{
CMyObject* pObject = (CMyObject*)pParam;
if (pObject == NULL ||
!pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
return 1; // if pObject is not valid
// do something with 'pObject'
return 0; // thread completed successfully
}
// inside a different function in the program
.
.
.
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
.
.
.