TIDTCPServer e Core 2 duo

Delphi

21/11/2008

Ola Pessoal!

Seguinte: Tenho uma aplicação usando os componentes TIDTCPServer e TIDTCPClient. Desenvolvo em D7 numa máquina AMD Athlon 64 e Windows XP Pro.

Na minha máquina (o AMD), rodo a aplicação servidora e aproximadamente 20 estações se conectam nela e tudo funciona perfeitamente, o dia todo, sem travamentos.

Quando instalo a aplicação servidora numa máquina Intel Core 2 duo, as estações até se conectam e os métodos da aplicação servidora começam a ser executados normalmente. O problema é que ocorre aleatoriamente, ou seja, as vezes é em um método, as vezes em outro, o travamento da aplicação e ninguém mais se conecta. Só finalizando para fechá-la.

Suspeito que o problema seja no processador com 2 núcleos. No gerenciador de tarefas do windows, já coloquei a aplicação para rodar em apenas 1 núcleo (na opção de afinidade), mas mesmo assim continua travando.

Alguém ai já passou por isso e/ou conhece alguma solução para esse problema?

Teria alguma forma de forçar, através de código, o programa rodar em apenas 1 núcleo? Se claro, o problema for com 2 núcleos.

Agradeço desde já!

Marcelo.


Tchelllo

Tchelllo

Curtidas 0

Respostas

Tchelllo

Tchelllo

21/11/2008

Pessoal, fiz alguns testes.

Alterando no msconfig, na aba BOOT.INI, em Opções avançadas, colquei no parametro /NUMPROC o valor 1 e reiniciei.

Após, executei a aplicação e tudo funcionou normalmente, sem travar.

Concluo então que o problema é devido ao processador com 2 núcleos mesmo.

Ao invés de deixar meu servidor rodando apenas um núcleo, existe uma maneira, através de código, de forçar a aplicação rodar em apenas 1 núcleo? Assim como o firebird, onde, através do parâmetro CpuAffinity do firebird.conf, podemos configurar quantos cpu´s ele usará.

Ah, esqueci de mencionar na msg. anterior, mas a aplicação acessa o firebird na maioria dos métodos. Será algum problema com isso?

Marcelo.


GOSTEI 0
Cabreu.jr

Cabreu.jr

21/11/2008

Amigo o problema deve ser com o firebird. Ao invés de setar a aplicação pra usar um núcleo sete só o firebird pra usar um núcleo que deve resolver.
Abra o firebird.conf e tire o comentário da linha CpuAffinityMask = 1


GOSTEI 0
Tchelllo

Tchelllo

21/11/2008

Obrigado por responder cabreu.jr!

Tentei fazer isso mas não resolveu. Tb tentei instalar o firebird na versão classic, mas tb não adiantou.

Tentei tb a função SetProcessAffinityMask direto no código, mas tb não adiantou, pois continuou travando. Estava colocando assim:

SetProcessAffinityMask(GetCurrentProcessId, $00000001);

O GetCurrentProcessId pega o Id do processo da aplicação (o arquivo .exe).

Já o $00000001, fará uso somente de um núcleo.

fonte: [url]http://www.delphi3000.com/articles/article_3565.asp?SK=multi¬20thread[/url]

Tentei colocar essa função no Create do form principal da aplicação e até logo após o application.initialize, e nada.

Esse problema tá complicado de resolver! :(


GOSTEI 0
Cabreu.jr

Cabreu.jr

21/11/2008

qual componente voce está usando com o firebird? voce faz uso de thread?por acaso voce usa algum componente tipo Eurekalog pra rastrear o erro?


GOSTEI 0
Tchelllo

Tchelllo

21/11/2008

Uso os componentes DBExpress que vem com o Delphi 7.

Estou usando o TIDTCPServer da paleta Indy, que cria uma thread para cada conexão. Ressalvo que antes de cada execução de determinado método, travo o server com LockList.

Não uso nenhum componente tipo o Eurekalog.


GOSTEI 0
Tchelllo

Tchelllo

21/11/2008

Pessoal, ninguém mais tem idéia da solução deste problema?


GOSTEI 0
POSTAR