Quero colocar uma Barra de Progresso na hora que tiver Sincronizando os Banco de Dados com o Sync Framework.
Tenho um Sistema que faz Sincronismo entre 2 Bancos. Tenho um Banco Local SQL Compact 3.5 SP1 e um Banco WEB SQL Server 2005, que funciona assim. Eu digito no Sistema e as informações vão para o Banco Local, quando eu mando Sincronizar ele vai para o Banco WEB. Ai se eu tiver fora de casa eu mando Sincronizar o programa e todas as informações são atualizadas no Banco. Isso funciona perfeitamente, eu uso esse artigo para fazer o sistema http://www.linhadecodigo.com.br/Artigo.aspx?id=2241
Mas agora vai o meu problema, o Sistema demora alguns segundos para Sincronizar os 2 Bancos e o cliente não sabe se o Sistema está Sincronizando ou travado até que ele termine. Ai quero colocar um ProgressBar, pode ser na Propriedade "marquee" só para a barra ficar se mechendo e quando terminar enche a Barra, mas o pior é quando eu clico no Botão para Sincronizar ele trava a Barra e ela tambem fica parada até terminar o Sincronismo.
Se quiser eu mando o meu Projeto, ele está sendo feito pelo VS2010. Mas se quiser eu faço um exemplo no VS2008, mas ele é exatamente igual ao Artigo.
Rodolfo Camargo
Curtidas 0
Respostas
Luiz Maia
13/10/2009
Ola Rodolfo, por favor me mande seu projeto para que eu possa dar uma avaliada no que esta ocorrendo.
Sendo que o uso do ProgressBar com o Marquee é bem simples, pode ser outro tipo de problema, não tem como dar errado.
Enquanto isto, caso seu projeto ja esteja em Produção, pode utilizar o comando try/catch e dar uma Mensagem (MessageBox) para o cliente assim que terminar ou dar alguma excessão na execução.
Aguardo o projeto, ok?
Abraços
Att
Luiz Maia
GOSTEI 0
Rodolfo Camargo
13/10/2009
Estou conseguindo resolver o meu problema, mas está dando um erro. Uso esse código para fazer o Sincronismo:
// Cria SyncAgent
BancoLocalSyncAgent syncAgent = new BancoLocalSyncAgent();
// Chama método Synchronize de forma assíncrona
// usando anonymous delegates
Func<Microsoft.Synchronization.Data.SyncStatistics> async = new Func<Microsoft.Synchronization.Data.SyncStatistics>(syncAgent.Synchronize);
async.BeginInvoke((r) =>
{
// Aqui o método Synchronize terminou...
Microsoft.Synchronization.Data.SyncStatistics syncStats = async.EndInvoke(r);
// Modifica o estilo do progress bar para indicar que o processamento foi finalizado
progressBar1.Style = ProgressBarStyle.Blocks;
progressBar1.MarqueeAnimationSpeed = 0;
progressBar1.Value = 0;
}, null);
// Na linha abaixo o método Synchrronize ainda está executando
// Modifica o estilo do progress bar para indicar que existe um processamento
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 100;
progressBar1.Value = 100;
Mas está dando um problema nessa Linha progressBar1.Style = ProgressBarStyle.Blocks; o problema que aparece é: Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on.
// Cria SyncAgent
BancoLocalSyncAgent syncAgent = new BancoLocalSyncAgent();
// Chama método Synchronize de forma assíncrona
// usando anonymous delegates
Func<Microsoft.Synchronization.Data.SyncStatistics> async = new Func<Microsoft.Synchronization.Data.SyncStatistics>(syncAgent.Synchronize);
async.BeginInvoke((r) =>
{
// Aqui o método Synchronize terminou...
Microsoft.Synchronization.Data.SyncStatistics syncStats = async.EndInvoke(r);
// Modifica o estilo do progress bar para indicar que o processamento foi finalizado
progressBar1.Style = ProgressBarStyle.Blocks;
progressBar1.MarqueeAnimationSpeed = 0;
progressBar1.Value = 0;
}, null);
// Na linha abaixo o método Synchrronize ainda está executando
// Modifica o estilo do progress bar para indicar que existe um processamento
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 100;
progressBar1.Value = 100;
Mas está dando um problema nessa Linha progressBar1.Style = ProgressBarStyle.Blocks; o problema que aparece é: Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on.
GOSTEI 0
Rodolfo Camargo
13/10/2009
Nesse código estou usando uma ProgressBar como Marquee, mas se puder fazer o Sincronismo e controlar como uma ProgressBar Block ou Continuous é melhor, porque ai verei em Tempo Real o quanto falta.
GOSTEI 0
Luiz Maia
13/10/2009
Oi Rodolfo, blz?
Para controlar o pb vc precisa saber a quantidade de loops que vai ter para incrementar no seu step.
Fiz este modelinho para dar uma olhada, so compilar e rodar, ok?
http://video.devmedia.com.br/discovirtual/200237/Rodolfo%20-%20progressBar.zip
Aguardo seu retorno.
Abraços
Att
Luiz Maia
GOSTEI 0
Rodolfo Camargo
13/10/2009
Isso tudo bem, mas o problema é esse erro que está dando quando tento mudar a Propriedade da Barra e Preenche-la. Vou enviar o Código completo, a unica coisa é que fiz no Visual Studio 2010. Se quiser eu Zipo o Código Fonte e te mando.
GOSTEI 0
Luiz Maia
13/10/2009
Por favor me mande o codigo zipado então.
Mas vc deu uma olhada no que te mandei?
Tentou usar desta forma? Funcionou?
Aguardo
Att
Luiz Maia
GOSTEI 0
Rodolfo Camargo
13/10/2009
Esse é o Link com todo o Projeto http://www.fileurls.com/download.ashx?id=fjrjld ele foi desenvolvido pelo Visual Studio 2010.
GOSTEI 0
Rodolfo Camargo
13/10/2009
Ou se quiser vou passando o problema que vai aparecendo.
GOSTEI 0
Rodolfo Camargo
13/10/2009
Ou se quiser vou passando o problema que vai aparecendo.
GOSTEI 0
Luiz Maia
13/10/2009
Rodolfo,
Para resolver o problema da Thread simultanea, faça o seguinte:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
namespace TesteProgressBar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
System.Threading.Thread t1 = new System.Threading.Thread(startProgress);
t1.Start();
}
void startProgress()
{
for (int i = 0; i < 10; i++)
{
SetControlPropertyValue(progressBar1, "value", i);
System.Threading.Thread.Sleep(100);
}
}
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
private void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
if (oControl.InvokeRequired)
{
SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl, propName, propValue });
}
else
{
Type t = oControl.GetType();
PropertyInfo[] props = t.GetProperties();
foreach (PropertyInfo p in props)
{
if (p.Name.ToUpper() == propName.ToUpper())
{
p.SetValue(oControl, propValue, null);
}
}
}
}
}
}
Veja que criei um método SetControlPropertyValue.
Ele resolve este problema, basta invoca-lo na chamada do progress bar onde ocorre o erro de thread, ok?
Veja no exemplo acima.
Aguardo
Att
Luiz Maia
GOSTEI 0
Rodolfo Camargo
13/10/2009
Resolveu sim o meu problema, agora estou conseguindo colocar a Barra que eu quero no Sincronismo. Muito Obrigado.
GOSTEI 0
Luiz Maia
13/10/2009
Legal Rodolfo,
Precisando, é so falar!
Estamos a disposição para qualque tipo de dúvidas.
Abraços
Att
Luiz Maia
GOSTEI 0