Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
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_SUSPENDEDInicie o thread com uma contagem de suspensão de um. UseCREATE_SUSPENDEDse quiser inicializar quaisquer dados de membro doCWinThreadobjeto, comom_bAutoDeleteou quaisquer membros de sua classe derivada, antes que o thread comece a ser executado. Quando a inicialização estiver concluída, use oCWinThread::ResumeThreadpara iniciar a execução da thread. O thread não será executado atéCWinThread::ResumeThreadser 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_CRITICALTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_LOWESTTHREAD_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_CRITICALTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_LOWESTTHREAD_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