Simoes
08-15-2006, 02:52 PM
Caros,
Estou com um problema que acredito ser simples para quem já trabalhou com
threads no VC++, estou fazendo uma interface com um hardware de telefone,
onde preciso capturar as teclas para fazer a determinada discagem, possuo um
softphone já implementado anteriormente em vc++ com diversas funções.
Para poder capturar as teclas implementei um pooling na serial usando thread.
Até ai tudo bem, usei o AfxBeginThread() - nao sei se foi a melhor escolha,
mas certamente é o jeito mais fácil -
O problema ocorre durante este pooling, o mesmo esta implementado em um
método da Dialog e neste método eu preciso acessar as funções do meu
softphone que estão implementadas em outros métodos da Dialog.
Como nao consegui ter acesso diretamente aos objetos da Dialog na Thread,
criei ponteiros para as Classes da seguinte maneira:
/////// THREAD /////////
UINT CVCSampleDlg::StartThread(LPVOID pParam) {
...
CVaxVoIP* p = reinterpret_cast<CVaxVoIP*> (pParam);
...
criando o ponteiro "p" para a classe CVaxVoIP consigo acessar métodos como o
tom do DTMF necessários para o momento da discagem, e no momento em que o
ponteiro acessa o método da Classe ocorre a exceção, informando que o objeto
ja está alocado.
qualquer ajuda é bem vinda,
abraços
Moises.
Frederico Pissarra
08-15-2006, 09:31 PM
"Simoes" <Simoes@discussions.microsoft.com> escreveu na mensagem
news:167095AF-1A2E-4F80-832A-08738E35F903@microsoft.com...
> Caros,
>
> Estou com um problema que acredito ser simples para quem já trabalhou com
> threads no VC++, estou fazendo uma interface com um hardware de telefone,
> onde preciso capturar as teclas para fazer a determinada discagem, possuo
> um
> softphone já implementado anteriormente em vc++ com diversas funções.
> Para poder capturar as teclas implementei um pooling na serial usando
> thread.
> Até ai tudo bem, usei o AfxBeginThread() - nao sei se foi a melhor
> escolha,
> mas certamente é o jeito mais fácil -
> O problema ocorre durante este pooling, o mesmo esta implementado em um
> método da Dialog e neste método eu preciso acessar as funções do meu
> softphone que estão implementadas em outros métodos da Dialog.
> Como nao consegui ter acesso diretamente aos objetos da Dialog na Thread,
> criei ponteiros para as Classes da seguinte maneira:
> /////// THREAD /////////
> UINT CVCSampleDlg::StartThread(LPVOID pParam) {
> ...
> CVaxVoIP* p = reinterpret_cast<CVaxVoIP*> (pParam);
> ...
>
> criando o ponteiro "p" para a classe CVaxVoIP consigo acessar métodos como
> o
> tom do DTMF necessários para o momento da discagem, e no momento em que o
> ponteiro acessa o método da Classe ocorre a exceção, informando que o
> objeto
> ja está alocado.
>
> qualquer ajuda é bem vinda,
>
> abraços
>
> Moises.
Moises,
Poste por aqui um exemplo de criação da thread, com a passagem do ponteiro
ligado a pvData... Aparentemente vc está fazendo a coisa certa, só deve
lembrar de colocar critical sections no código das threads (inclusive a
principal) que acessam esses dados para não ter problemas:
// objeto Critical Section global.
CCriticalSection g_myCS;
.. . .
/////// THREAD /////////
UINT CVCSampleDlg::StartThread(LPVOID pParam)
{
. . .
CVaxVoIP* p = reinterpret_cast<CVaxVoIP*> (pParam);
// Usando um método de CVaxVoIP...
g_myCS.Lock();
p->f();
g_myCS.Unlock();
} ...
Uma coisa que vc pode tentar é verificar se o ponteiro p não é NULL antes de
tentar chamar uma função membro:
if (p)
{
g_myCS.Lock();
p->f();
g_myCS.Unlock();
}
Ou pelo menos user assert() para verificar a validade do ponteiro!
[[]]ão
Fred
Simoes
08-18-2006, 07:32 PM
"Frederico Pissarra" escreveu:
> Moises,
>
> Poste por aqui um exemplo de criação da thread, com a passagem do ponteiro
> ligado a pvData... Aparentemente vc está fazendo a coisa certa, só deve
> lembrar de colocar critical sections no código das threads (inclusive a
> principal) que acessam esses dados para não ter problemas:
>
> // objeto Critical Section global.
> CCriticalSection g_myCS;
>
> .. . .
>
> /////// THREAD /////////
> UINT CVCSampleDlg::StartThread(LPVOID pParam)
> {
> . . .
> CVaxVoIP* p = reinterpret_cast<CVaxVoIP*> (pParam);
>
> // Usando um método de CVaxVoIP...
> g_myCS.Lock();
> p->f();
> g_myCS.Unlock();
> } ...
>
> Uma coisa que vc pode tentar é verificar se o ponteiro p não é NULL antes de
> tentar chamar uma função membro:
>
> if (p)
> {
> g_myCS.Lock();
> p->f();
> g_myCS.Unlock();
> }
>
> Ou pelo menos user assert() para verificar a validade do ponteiro!
>
> [[]]ão
> Fred
>
Valeu Fred,
O Desing da Classe ficou assim:
arquivo: "VCSampleDlg.h"
class CVCSampleDlg : public CDialog
{
public:
CVCSampleDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CVCSampleDlg(); // virtual destructor
static UINT StartThread (LPVOID param); // método da thread
...
}
Já no desenvolvimento:
arquivo: "VCSampleDlg.cpp"
no método "::OnInitDialog() " chamei:
AfxBeginThread(StartThread,NULL,THREAD_PRIORITY_NORMAL);
//para dar o start na thread
e impementei ela como mandei na ultima postagem..
anteriormente eu criei direto no VCSampleDlg.cpp o objeto do tipo
"CCriticalSection", mas acredito que nao estava usando corretamente, criei da
seguinte forma:
CCriticalSection c_s; //como global fora do escopo da Classe
e ma hora de chamar os métodos Lock() e Unlock() quando utilizava o ponteiro
ele seguia dando acesso simultaneo.
Vou tentar aplicar dessa forma que tu passaste, pois ainda nao testei, tipo
testar se o ponteiro pe NULL, qualquer coisa eu torno a postar.
De qualquer forma se perceberes alguma falha na implementação da classe me
da um toque.
[]'s
Moisés