usando thread .. erro

Delphi

31/10/2007

alguem sabe como faço pra resolver esse erro ??

CheckSynchronize called from thread $B78, which is NOT the main thread

uso uma thread A que start uma B.. pelo que li a respeito não posso chamar o CheckSynchronize de uma thread principal.. ???


Souza

Souza

Curtidas 0

Respostas

Massuda

Massuda

31/10/2007

...não posso chamar o CheckSynchronize de uma thread principal.. ???
A mensagem de erro sugere exatamente o oposto... que CheckSynchronize DEVE ser chamada a partir da thread principal.


GOSTEI 0
Souza

Souza

31/10/2007

[quote:a0162bbc79=´souza´]...não posso chamar o CheckSynchronize de uma thread principal.. ???
A mensagem de erro sugere exatamente o oposto... que CheckSynchronize DEVE ser chamada a partir da thread principal.[/quote:a0162bbc79]

A PRINCIPAL SERIA A QUE FOI CRIADA PRIMEIRO ?
ESSE É O CODIGO QUE EXECUTA DENTRO DO EXECUTE DA ´A´..

if (form1.indListaBuffer > 10) and (bLeia = True) then
begin
CheckSynchronize(100);
TThreadtags.Create(False); // CRIO B
bLeia := False;
end;

seria isso ?


GOSTEI 0
Massuda

Massuda

31/10/2007

Thread principal é aquela que é criada pelo Windows para rodar seu programa. Pelo seu texto, você criou duas threads... nenhuma delas é a thread principal.


GOSTEI 0
Massuda

Massuda

31/10/2007

Explique melhor seu problema... eventualmente existe outra solução.


GOSTEI 0
Souza

Souza

31/10/2007

isso mesmo eu criei duas threads .. A que le um buffer e salva em uma Tlist e outra B que varre o tList pega o que foi lido pela A.. e grava no banco..

só que quando vou finalizar a gravação da esse erro :
CheckSynchronize called from thread $B78, which is NOT the main thread.

não to usando o synchronize(metodo);
no execute da thread ...


GOSTEI 0
Massuda

Massuda

31/10/2007

Primeiro... porque você deseja usar isso?


GOSTEI 0
Souza

Souza

31/10/2007

eu preciso pegar as cotações de um servidor broadcast..
cotação de dollar, soja .....
dai me conecto a um ip e porta.. usando o indy.. leio co conteudo do buffer .. e salvo em um Tlist.. ´conteudo esse algumas tagas XML´,
a leitura é feita pela thread A .. a thread B trata a as tags lidas fecha o bloco xml e grava em uma tabela na base..
a A consegue ler sem problemas mas quando a B vai gravar da esse erro..,
CheckSynchronize called from thread $B78, which is NOT the main thread
..

faço duas threads pq tenho que ler o maximo de informação possivel.. do buffer para não perder cotação..
e uso o Tlist para armazenar o que foi lido... pq as tagas não vem completas então eu preciso concatenar o que foi lido .. para ter o bloco xml todo. esse é o papel da A.

se puder me add no msn .. fabio.srs@hotmail.com
obrigado pela atenção.


GOSTEI 0
Massuda

Massuda

31/10/2007

ok, mas para que você usa esse CheckSynchronize? O que você espera que ele faça?


GOSTEI 0
Macario

Macario

31/10/2007

[quote:1f669903ae=´Massuda´][quote:1f669903ae=´souza´]...não posso chamar o CheckSynchronize de uma thread principal.. ???
A mensagem de erro sugere exatamente o oposto... que CheckSynchronize DEVE ser chamada a partir da thread principal.[/quote:1f669903ae]

A PRINCIPAL SERIA A QUE FOI CRIADA PRIMEIRO ?
ESSE É O CODIGO QUE EXECUTA DENTRO DO EXECUTE DA ´A´..

if (form1.indListaBuffer > 10) and (bLeia = True) then
begin
CheckSynchronize(100);
TThreadtags.Create(False); // CRIO B
bLeia := False;
end;

seria isso ?[/quote:1f669903ae]

Nao sei bem se esta maneira de criar uma TThread dentro de outra é a ideal.

Voce poderia ter as duas independentes e usar o WaintFor para controlar a leitura. E se necessario usar a Classe Critical para nao perder o sincronismo.

:roll:


GOSTEI 0
Souza

Souza

31/10/2007

Pessoal para finalizar ..
eis o que estava dando erro nas threads ... a Thread B que fazia a gravação no banco usava um componente que fazia a chamada ao metodo checksycronize .. isso causava o erro na danadinha.... pois esse metodo não pode ser chamado por uma thread que não seja a principal (´a própria aplicação´)..

obrigado pela colaboração.


GOSTEI 0
POSTAR