OleException quot;objeto não conectado ao servidorquot;
Olá!
O problema é o seguinte: minha aplicação gera relatórios em planilhas Excel, usando TExcelApplication e seus amigos da paleta Servers.
Como as consultas SQL e o preenchimento da planilha em si são demorados, a aplicação ficava ´congelada´ até que o status da operação mudasse, chamando o famoso Application.ProcessMessages, para então congelar novamente.
Então resolvi criar uma Thread separada para fazer as consultas e o preenchimento da planilha. Desta forma, a aplicação não congela e eu ainda ganho a possibilidade de interromper o processo de forma elegante, sem apelar para o ctrl + alt + del.
Criei a Thread, usei num programinha de teste e funcionou. Então fui usá-la no programa principal. Aparentemente estava tudo certo, até que me deparei com a mensagem de erro aí do título do tópico!
Debugando, descobri que ela acontecia no momento em que a aplicação tentava preencher a planilha Excel.
Alguém sabe o que pode ser isso?
O problema é o seguinte: minha aplicação gera relatórios em planilhas Excel, usando TExcelApplication e seus amigos da paleta Servers.
Como as consultas SQL e o preenchimento da planilha em si são demorados, a aplicação ficava ´congelada´ até que o status da operação mudasse, chamando o famoso Application.ProcessMessages, para então congelar novamente.
Então resolvi criar uma Thread separada para fazer as consultas e o preenchimento da planilha. Desta forma, a aplicação não congela e eu ainda ganho a possibilidade de interromper o processo de forma elegante, sem apelar para o ctrl + alt + del.
Criei a Thread, usei num programinha de teste e funcionou. Então fui usá-la no programa principal. Aparentemente estava tudo certo, até que me deparei com a mensagem de erro aí do título do tópico!
Debugando, descobri que ela acontecia no momento em que a aplicação tentava preencher a planilha Excel.
Alguém sabe o que pode ser isso?
Programaker
Curtidas 0
Respostas
Cd.wagner.sena
24/04/2007
vc se conecta com que tipo de recurso?
Outra coisa, vc esta tentando exportar quantos dados para o excel? numero de linhas?
Outra coisa, vc esta tentando exportar quantos dados para o excel? numero de linhas?
GOSTEI 0
Programaker
24/04/2007
Não entendi muito bem o que você quis dizer com ´recurso com o qual eu me conecto´. Estou usando os componentes TExcelApplication, TExcelWorkbook e TExcelWorksheet. Alguns desenvolvedores usam CreateOLEApplication e usam um Variant para referenciar o objeto resultante (eu pessoalmente não gosto muito desta abordagem, pois não permite explorar os objetos com code-completion)... seria isso?
Quanto à quantidade de dados, eles usam os resultados de várias consultas para preencher a planilha e o layout delas nem sempre é simples, apenas em forma de tabela. Este relatório que threadifiquei primeiro pode variar de 1 a 30-e-poucas linhas, usando entre 8 e 9 consultas, de acordo com o filtro informado.
Os outros são ainda mais complexos, tem um que usa 46 consultas diferentes. Mas isso nunca foi problema, até eu colocar o multithreading na jogada.
Quanto à quantidade de dados, eles usam os resultados de várias consultas para preencher a planilha e o layout delas nem sempre é simples, apenas em forma de tabela. Este relatório que threadifiquei primeiro pode variar de 1 a 30-e-poucas linhas, usando entre 8 e 9 consultas, de acordo com o filtro informado.
Os outros são ainda mais complexos, tem um que usa 46 consultas diferentes. Mas isso nunca foi problema, até eu colocar o multithreading na jogada.
GOSTEI 0
Programaker
24/04/2007
Mais uma informação: usando o método Synchronize, o erro desaparece. Só que ao mesmo tempo, a aplicação volta a ficar congelada.
Desse jeito, tendo que sincronizar com a main-thread da VCL, o sentido de ter uma thread separada se perde, porque eu queria justamente que a aplicação continuasse respondendo durante o processo de emissão.
Será que multithreading usando essas automações OLE é inviável? :(
Desse jeito, tendo que sincronizar com a main-thread da VCL, o sentido de ter uma thread separada se perde, porque eu queria justamente que a aplicação continuasse respondendo durante o processo de emissão.
Será que multithreading usando essas automações OLE é inviável? :(
GOSTEI 0
Massuda
24/04/2007
Inclua, no início da sua procedure TThread.Execute, antes de ativar o Excel, o seguinte...... e no final inclua......essas funções estão na unit Windows ou ActiveX.
CoInitialize(nil);
CoUninitialize;
GOSTEI 0
Programaker
24/04/2007
Era isso mesmo! agora funcionou! Brigadão pela dica! :D
GOSTEI 0