Partilhar via


CWinThread Classe

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Representa um fio de execução dentro de uma aplicação.

Sintaxe

class CWinThread : public CCmdTarget

Membros

Construtores Públicos

Nome Description
CWinThread::CWinThread Constrói um CWinThread objeto.

Métodos Públicos

Nome Description
CWinThread::CreateThread Inicia a execução de um CWinThread objeto.
CWinThread::ExitInstance Override para limpar quando o teu thread terminar.
CWinThread::GetMainWnd Recupera um ponteiro para a janela principal da thread.
CWinThread::GetThreadPriority Obtém a prioridade do tópico atual.
CWinThread::InitInstance Override para realizar a inicialização da instância da thread.
CWinThread::IsIdleMessage Verifica mensagens especiais.
CWinThread::OnIdle Override para realizar processamento de tempo ocioso específico para thread.
CWinThread::PostThreadMessage Publica uma mensagem noutro CWinThread objeto.
CWinThread::PreTranslateMessage Filtra as mensagens antes de serem enviadas para as funções TranslateMessage do Windows e DispatchMessage.
CWinThread::ProcessMessageFilter Interceta certas mensagens antes de chegarem à aplicação.
CWinThread::ProcessWndProcException Interceta todas as exceções não tratadas lançadas pelos manipuladores de mensagens e comandos do thread.
CWinThread::PumpMessage Contém o ciclo de mensagens do thread.
CWinThread::ResumeThread Diminuição da contagem de suspensões de um tópico.
CWinThread::Run Função de controlo para threads com uma bomba de mensagens. Override para personalizar o loop de mensagem predefinido.
CWinThread::SetThreadPriority Define a prioridade da thread atual.
CWinThread::SuspendThread Incrementa a contagem de suspensões de um fio.

Operadores Públicos

Nome Description
CWinThread::operator HANDLE Recupera a pega do CWinThread objeto.

Membros de Dados Públicos

Nome Description
CWinThread::m_bAutoDelete Especifica se deve destruir o objeto na terminação do thread.
CWinThread::m_hThread Nome para o tópico atual.
CWinThread::m_nThreadID ID do tópico atual.
CWinThread::m_pActiveWnd Apontar para a janela principal da aplicação contentor quando um servidor OLE estiver ativo no local.
CWinThread::m_pMainWnd Mantém um ponteiro para a janela principal da aplicação.

Observações

O fio principal de execução é geralmente fornecido por um objeto derivado de CWinApp; CWinApp é derivado de CWinThread. Objetos adicionais CWinThread permitem múltiplos threads dentro de uma dada aplicação.

Existem dois tipos gerais de threads que CWinThread suportam: threads de trabalho e threads de interface de utilizador. As threads de trabalho não têm uma bomba de mensagens: por exemplo, uma thread que realiza cálculos em segundo plano numa aplicação de folhas de cálculo. As threads de interface de utilizador têm uma bomba de mensagens e processam mensagens recebidas do sistema. CWinApp e as classes derivadas dela são exemplos de threads de interface de utilizador. Outros threads de interface de utilizador também podem ser derivados diretamente de CWinThread.

Os objetos de classe CWinThread normalmente existem durante toda a duração do thread. Se quiser modificar este comportamento, defina m_bAutoDelete para FALSE.

A CWinThread classe é necessária para tornar o teu código e MFC totalmente seguros para threads. Os dados locais de thread usados pela framework para manter informação específica de thread são geridos por CWinThread objetos. Devido a esta dependência de CWinThread lidar com dados locais de threads, qualquer thread que utilize MFC deve ser criado por MFC. Por exemplo, um thread criado pela função _beginthreadde tempo de execução , _beginthreadex não pode usar quaisquer APIs MFC.

Para criar um tópico, chame AfxBeginThread. Existem duas formas, dependendo se pretende um thread de trabalho ou de interface de utilizador. Se quiseres um thread de interface de utilizador, passa para AfxBeginThread um ponteiro para a CRuntimeClass da tua CWinThreadclasse derivada em . Se quiseres criar um thread de trabalho, passa para AfxBeginThread um ponteiro para a função de controlo e o parâmetro para a função de controlo. Para threads de trabalho e threads de interface de utilizador, pode especificar parâmetros opcionais que modificam prioridade, tamanho da pilha, flags de criação e atributos de segurança. AfxBeginThread Vai devolver um ponteiro para o teu novo CWinThread objeto.

Em vez de chamar AfxBeginThread, pode-se construir um CWinThreadobjeto derivado em e depois chamar CreateThread. Este método de construção em duas etapas é útil se quiser reutilizar o CWinThread objeto entre a criação e terminação sucessivas das execuções de threads.

Para mais informações sobre CWinThread, veja os artigos Multithreading with C++ and MFC, Multithreading: Creating User-Interface Threads, Multithreading: Creating Worker Threads, e Multithreading: How to Use the Synchronization Classes.

Hierarquia de herança

CObject

CCmdTarget

CWinThread

Requerimentos

Cabeçalho:afxwin.h

CWinThread::CreateThread

Cria um thread para executar dentro do espaço de endereçamento do processo que chama.

BOOL CreateThread(
    DWORD dwCreateFlags = 0,
    UINT nStackSize = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

Parâmetros

dwCreateFlags
Especifica um sinalizador adicional que controla a criação do thread. Este sinalizador pode conter um de dois valores:

  • CREATE_SUSPENDED Inicie o thread com uma contagem de suspensão de um. Use CREATE_SUSPENDED se quiser inicializar quaisquer dados de membro do CWinThread objeto, como m_bAutoDelete ou quaisquer membros de sua classe derivada, antes que o thread comece a ser executado. Quando a inicialização estiver concluída, use o CWinThread::ResumeThread para iniciar a execução da thread. O thread não será executado até CWinThread::ResumeThread ser chamado.

  • 0 Iniciar o tópico imediatamente após a criação.

nStackSize
Especifica o tamanho em bytes da pilha para o novo thread. Se for 0, o tamanho da pilha por defeito é o mesmo tamanho do thread principal do processo.

lpSecurityAttrs
Aponta para uma SECURITY_ATTRIBUTES estrutura que especifica os atributos de segurança para o thread.

Valor de retorno

Diferente de zero se o thread for criado com sucesso; caso contrário, 0.

Observações

Use AfxBeginThread para criar um objeto thread e executá-lo numa só etapa. Use CreateThread se quiser reutilizar o objeto thread entre a criação e terminação sucessivas das execuções de thread.

CWinThread::CWinThread

Constrói um CWinThread objeto.

CWinThread();

Observações

Para iniciar a execução do thread, chame a CreateThread função membro. Normalmente criará threads chamando AfxBeginThread, que chamará este construtor e CreateThread.

CWinThread::ExitInstance

Chamada pela framework a partir de uma função membro raramente Run sobreposta para sair desta instância do thread, ou se uma chamada falhar InitInstance .

virtual int ExitInstance();

Valor de retorno

O código de saída da thread; 0 indica que não há erros, e valores superiores a 0 indicam um erro. Este valor pode ser recuperado chamando GetExitCodeThread.

Observações

Não chame esta função membro de qualquer lugar que não seja dentro da Run função membro. Esta função membro é usada apenas em threads de interface de utilizador.

A implementação padrão desta função elimina o CWinThread objeto se m_bAutoDelete for TRUE. Substitua esta função se quiser realizar uma limpeza adicional quando a sua thread terminar. A tua implementação ExitInstance de deve chamar a versão da classe base depois de o teu código ser executado.

CWinThread::GetMainWnd

Se a sua aplicação for um servidor OLE, chame esta função para recuperar um ponteiro para a janela principal ativa da aplicação em vez de se referir diretamente ao m_pMainWnd membro do objeto da aplicação.

virtual CWnd* GetMainWnd();

Valor de retorno

Esta função devolve um ponteiro para um dos dois tipos de janelas. Se o seu thread fizer parte de um servidor OLE e tiver um objeto ativo no local dentro de um contentor ativo, esta função devolve o CWinApp::m_pActiveWnd elemento de dados do CWinThread objeto.

Se não houver nenhum objeto ativo no local dentro de um contentor ou se a sua aplicação não for um servidor OLE, esta função devolve o m_pMainWnd membro de dados do seu objeto thread.

Observações

Para threads de interface de utilizador, isto equivale a referir-se diretamente ao m_pActiveWnd membro do seu objeto de aplicação.

Se a sua aplicação não for um servidor OLE, então chamar esta função é equivalente a referir-se diretamente ao m_pMainWnd membro do seu objeto de aplicação.

Substitua esta função para modificar o comportamento padrão.

CWinThread::GetThreadPriority

Obtém o nível de prioridade atual deste tópico.

int GetThreadPriority();

Valor de retorno

O nível de prioridade atual do thread dentro da sua classe de prioridade. O valor devolvido será um dos seguintes, listado da prioridade mais alta para a mais baixa:

  • THREAD_PRIORITY_TIME_CRITICAL

  • THREAD_PRIORITY_HIGHEST

  • THREAD_PRIORITY_ABOVE_NORMAL

  • THREAD_PRIORITY_NORMAL

  • THREAD_PRIORITY_BELOW_NORMAL

  • THREAD_PRIORITY_LOWEST

  • THREAD_PRIORITY_IDLE

Para mais informações sobre estas prioridades, consulte SetThreadPriority o SDK do Windows.

CWinThread::InitInstance

InitInstance deve ser sobreposto para inicializar cada nova instância de um thread de interface de utilizador.

virtual BOOL InitInstance();

Valor de retorno

Não nula se a inicialização for bem-sucedida; caso contrário, 0.

Observações

Normalmente, substitui-se InitInstance para executar tarefas que devem ser concluídas quando um thread é criado pela primeira vez.

Esta função membro é usada apenas em threads de interface de utilizador. Realizar a inicialização dos threads de trabalho na função de controlo passada para AfxBeginThread.

CWinThread::IsIdleMessage

Sobrescrita esta função para evitar OnIdle que seja chamada depois de mensagens específicas terem sido geradas.

virtual BOOL IsIdleMessage(MSG* pMsg);

Parâmetros

pMsg
Aponta para a mensagem atual a ser processada.

Valor de retorno

Não nulo se OnIdle deve ser chamado após o processamento da mensagem; caso contrário, 0.

Observações

A implementação por defeito não chama OnIdle após mensagens redundantes do rato e mensagens geradas por carets a piscar.

Se uma aplicação criou um temporizador curto, OnIdle será chamada frequentemente, causando problemas de desempenho. Para melhorar o desempenho de tal aplicação, IsIdleMessage substitua a classe -derivada da CWinAppaplicação para verificar as WM_TIMER mensagens da seguinte forma:

BOOL CMyWinApp::IsIdleMessage(MSG* pMsg)
{
   if (!CWinApp::IsIdleMessage(pMsg) || pMsg->message == WM_TIMER)
      return FALSE;
   else
      return TRUE;
}

O manuseamento WM_TIMER desta forma melhorará o desempenho de aplicações que utilizam temporizadores curtos.

CWinThread::m_bAutoDelete

Especifica se o CWinThread objeto deve ser automaticamente eliminado na terminação da thread.

BOOL m_bAutoDelete;

Observações

O m_bAutoDelete membro de dados é uma variável pública do tipo BOOL.

O valor de m_bAutoDelete não afeta o modo como o cabo do thread subjacente está fechado, mas afeta o momento de fechar o handle. A alavanca do fio está sempre fechada quando o CWinThread objeto é destruído.

CWinThread::m_hThread

Pega ao fio preso a isto CWinThread.

HANDLE m_hThread;

Observações

O m_hThread membro de dados é uma variável pública do tipo HANDLE. Só é válido se o objeto kernel thread subjacente existir atualmente e o handle ainda não tiver sido fechado.

O CWinThread destruidor chama m_hThreadCloseHandle a . Se m_bAutoDelete for TRUE quando o thread termina, o CWinThread objeto é destruído, o que invalida quaisquer ponteiros para o CWinThread objeto e as suas variáveis membros. Pode precisar que o m_hThread membro verifique o valor de saída do thread, ou que espere por um sinal. Para manter o CWinThread objeto e o seu m_hThread membro durante a execução do thread e depois de terminar, defina m_bAutoDelete para FALSE antes de permitir que a execução do thread continue. Caso contrário, a thread pode terminar, destruir o CWinThread objeto e fechar a maçaneta antes de tentar usá-la. Se usar esta técnica, é responsável pela eliminação do CWinThread objeto.

CWinThread::m_nThreadID

ID do tópico associado a este CWinThread.

DWORD m_nThreadID;

Observações

O m_nThreadID membro de dados é uma variável pública do tipo DWORD. Só é válido se o objeto kernel thread subjacente existir atualmente. Veja também observações sobre m_hThread o tempo de vida.

Example

Veja o exemplo para AfxGetThread.

CWinThread::m_pActiveWnd

Use este membro de dados para armazenar um ponteiro para o objeto janela ativo do seu thread.

CWnd* m_pActiveWnd;

Observações

A Microsoft Foundation Class Library termina automaticamente o seu thread quando a janela referida por m_pActiveWnd for fechada. Se este thread for o principal de uma aplicação, a aplicação também será terminada. Se este membro de dados for NULL, a janela ativa para o objeto da CWinApp aplicação será herdada. m_pActiveWnd é uma variável pública do tipo CWnd*.

Normalmente, define-se esta variável membro quando se sobrepõe InitInstance. Num thread de trabalho, o valor deste membro de dados é herdado do seu thread pai.

CWinThread::m_pMainWnd

Use este membro de dados para armazenar um ponteiro para o objeto principal da janela do seu thread.

CWnd* m_pMainWnd;

Observações

A Microsoft Foundation Class Library termina automaticamente o seu thread quando a janela referida por m_pMainWnd for fechada. Se este thread for o principal de uma aplicação, a aplicação também será terminada. Se este elemento de dados for NULL, a janela principal do objeto da CWinApp aplicação será usada para determinar quando terminar o thread. m_pMainWnd é uma variável pública do tipo CWnd*.

Normalmente, define-se esta variável membro quando se sobrepõe InitInstance. Num thread de trabalho, o valor deste membro de dados é herdado do seu thread pai.

CWinThread::OnIdle

Sobrescreva esta função de membro para realizar processamento em tempo ocioso.

virtual BOOL OnIdle(LONG lCount);

Parâmetros

lCount
Um contador incrementado cada vez OnIdle é chamado quando a fila de mensagens do thread está vazia. Esta contagem é reiniciada para 0 cada vez que uma nova mensagem é processada. Pode usar o lCount parâmetro para determinar o tempo relativo de inatividade do thread sem processar uma mensagem.

Valor de retorno

Não zero para receber mais tempo de processamento inativo; 0 se não for necessário mais tempo de processamento inativo.

Observações

OnIdle é chamada no ciclo de mensagens por defeito quando a fila de mensagens do thread está vazia. Use o seu override para chamar as suas próprias tarefas de idle-handler em segundo plano.

OnIdle deve devolver 0 para indicar que não é necessário tempo adicional de processamento inativo. O lCount parâmetro é incrementado cada vez OnIdle que é chamado quando a fila de mensagens está vazia e é reiniciado para 0 cada vez que uma nova mensagem é processada. Podes chamar as tuas diferentes rotinas de repouso com base nesta contagem.

A implementação padrão desta função membro liberta objetos temporários e bibliotecas de ligação dinâmica não utilizadas da memória.

Esta função membro é usada apenas em threads de interface de utilizador.

Como a aplicação não pode processar mensagens até OnIdle receber retornos, não realize tarefas longas nesta função.

CWinThread::operator HANDLE

Recupera a pega do CWinThread objeto.

operator HANDLE() const;

Valor de retorno

Se for bem-sucedido, o cabo do objeto thread; caso contrário, NULL.

Observações

Usa o handle para ligar diretamente às APIs do Windows.

CWinThread::PostThreadMessage

Chamado para publicar uma mensagem definida pelo utilizador para outro CWinThread objeto.

BOOL PostThreadMessage(
    UINT message,
    WPARAM wParam,
    LPARAM lParam);

Parâmetros

message
ID da mensagem definida pelo utilizador.

wParam
Primeiro parâmetro de mensagem.

lParam
Segundo parâmetro de mensagem.

Valor de retorno

Não nulo se for bem-sucedido; caso contrário, 0.

Observações

A mensagem publicada é mapeada para o manipulador de mensagens adequado pelo macro ON_THREAD_MESSAGEde mapa de mensagens .

Observação

Quando chamas PostThreadMessage, a mensagem é colocada na fila de mensagens do thread. No entanto, como as mensagens publicadas desta forma não estão associadas a uma janela, o MFC não as despacha para manipuladores de mensagens ou comandos. Para gerir estas mensagens, sobrepor a PreTranslateMessage() função da sua CWinAppclasse derivada e tratar as mensagens manualmente.

CWinThread::PreTranslateMessage

Sobrescreva esta função para filtrar as mensagens da janela antes que sejam enviadas para as funções TranslateMessage do Windows e DispatchMessage.

virtual BOOL PreTranslateMessage(MSG* pMsg);

Parâmetros

pMsg
Aponta para uma MSG estrutura que contém a mensagem a processar.

Valor de retorno

Diferente de zero se a mensagem foi totalmente processada e PreTranslateMessage não deve ser processada mais. Zero se a mensagem deve ser processada da forma normal.

Observações

Esta função membro é usada apenas em threads de interface de utilizador.

CWinThread::ProcessMessageFilter

A função hook do framework chama esta função membro para filtrar e responder a certas mensagens do Windows.

virtual BOOL ProcessMessageFilter(
    int code,
    LPMSG lpMsg);

Parâmetros

code
Especifica um código de gancho. Esta função membro usa o código para determinar como processar lpMsg.

lpMsg
Um ponteiro para uma estrutura WindowsMSG.

Valor de retorno

Não nula se a mensagem for processada; caso contrário, 0.

Observações

Uma função hook processa eventos antes de serem enviados para o processamento normal de mensagens da aplicação.

Se sobrepor esta funcionalidade avançada, certifique-se de chamar a versão de classe base para manter o processamento de hooks do framework.

CWinThread::ProcessWndProcException

O framework chama esta função membro sempre que o handler não apanha uma exceção lançada num dos handlers de mensagens ou comandos do seu thread.

virtual LRESULT ProcessWndProcException(
    CException* e,
    const MSG* pMsg);

Parâmetros

e
Aponta para uma exceção não resolvida.

pMsg
Aponta para uma MSG estrutura que contém informação sobre a mensagem do Windows que fez o framework lançar uma exceção.

Valor de retorno

-1 se for gerada uma WM_CREATE exceção; caso contrário, 0.

Observações

Não chame diretamente esta função membro.

A implementação padrão desta função membro trata apenas exceções geradas a partir das seguintes mensagens:

Comando Ação
WM_CREATE Falha.
WM_PAINT Valide a janela afetada, impedindo assim que outra WM_PAINT mensagem seja gerada.

Substitua esta função de membro para fornecer uma gestão global das suas exceções. Chama a funcionalidade base apenas se quiseres mostrar o comportamento padrão.

Esta função membro é usada apenas em threads que possuem um message pump.

CWinThread::PumpMessage

Contém o ciclo de mensagens do thread.

virtual BOOL PumpMessage();

Observações

PumpMessage contém o ciclo de mensagens do thread. PumpMessage é chamado por CWinThread para bombear as mensagens do fio. Pode ligar PumpMessage diretamente para forçar o processamento das mensagens, ou pode sobrescrever PumpMessage para alterar o comportamento predefinido.

Chamar PumpMessage diretamente e sobrepor o seu comportamento padrão é recomendado apenas para utilizadores avançados.

CWinThread::ResumeThread

Chamado para retomar a execução de um thread suspenso pela SuspendThread função membro, ou de um thread criado com o CREATE_SUSPENDED flag.

DWORD ResumeThread();

Valor de retorno

A contagem anterior de suspensões do tópico se for bem-sucedida; 0xFFFFFFFF caso contrário. Se o valor de retorno for zero, a thread atual não foi suspensa. Se o valor de retorno for um, a thread foi suspensa, mas agora é reiniciada. Qualquer valor de retorno superior a um significa que o thread permanece suspenso.

Observações

A contagem de suspensões da thread atual é reduzida em um. Se a contagem de suspensões for reduzida a zero, a thread retoma a execução; caso contrário, o tópico permanece suspenso.

CWinThread::Run

Fornece um ciclo de mensagens predefinido para threads de interface de utilizador.

virtual int Run();

Valor de retorno

Um int valor que é devolvido pelo fio. Este valor pode ser recuperado chamando GetExitCodeThread.

Observações

Run adquire e despacha mensagens do Windows até que a aplicação receba uma WM_QUIT mensagem. Se a fila de mensagens do thread atualmente não contiver mensagens, chamadas RunOnIdle para realizar processamento em tempo ocioso. As mensagens recebidas vão para a PreTranslateMessage função membro para processamento especial e depois para a função TranslateMessage Windows para tradução padrão do teclado. Finalmente, é chamada a DispatchMessage função Windows.

Run raramente é ultrapassado, mas podes sobrepô-lo para implementar um comportamento especial.

Esta função membro é usada apenas em threads de interface de utilizador.

CWinThread::SetThreadPriority

Esta função define o nível de prioridade do thread atual dentro da sua classe de prioridade.

BOOL SetThreadPriority(int nPriority);

Parâmetros

nPriority
Especifica o novo nível de prioridade do thread dentro da sua classe de prioridade. Este parâmetro deve ser um dos seguintes valores, listados de maior para menor:

  • THREAD_PRIORITY_TIME_CRITICAL

  • THREAD_PRIORITY_HIGHEST

  • THREAD_PRIORITY_ABOVE_NORMAL

  • THREAD_PRIORITY_NORMAL

  • THREAD_PRIORITY_BELOW_NORMAL

  • THREAD_PRIORITY_LOWEST

  • THREAD_PRIORITY_IDLE

Para mais informações sobre estas prioridades, consulte SetThreadPriority o SDK do Windows.

Valor de retorno

Não nulo se a função fosse bem-sucedida; caso contrário, 0.

Observações

Só pode ser chamada depois de CreateThread regressar com sucesso.

CWinThread::SuspendThread

Incrementa a contagem de suspensões da thread atual.

DWORD SuspendThread();

Valor de retorno

A contagem anterior de suspensões do tópico se for bem-sucedida; 0xFFFFFFFF caso contrário.

Observações

Se algum thread tiver um número de suspensões acima de zero, esse thread não é executado. A thread pode ser retomada chamando a ResumeThread função membro.

Consulte também

CCmdTarget Classe
Gráfico de Hierarquia
CWinApp Classe
CCmdTarget Classe