Jump to content

Gerar Gráficos em Tempo Real


Guest yyajsayy
 Share

Recommended Posts

Guest user14912

Boas pessoal.

Estou com uma pequena dúvida que gostaria de discutir com vocês.

É o seguinte, estou a receber dados (em python) de um dispositivo externo, e a minha taxa é de 1000 registos por segundo.

Sim senhor, mas no entanto tenho de fazer uma interface para interacção com o utilizador (uma aplicação) e mostrar um gráfico dos valores em tempo real, só isto.

A minha questão é a seguinte, é fácil em python construir uma pequena aplicação a interagir com um SGDB para criação de utilizadores, etc.. e fazer a amostragem do gráfico em tempo real??

Ou terei de migrar para uma outra linguagen tipo vb.net??

(Vb.net seria mais fácil talvés na criação dos objectos, janelas, botões,etc.., visto que já tenho o algoritmo de recepção dos dados a funcionar em python, onde basicamente agr só teria de "fazer" a aplicação em modo gráfico).

Um dos problemas disto tudo (pelo que li em foruns) é mesmo a amostragem em tempo real..

Algum feedback que me ajude? Toda a ajuda é bem vinda.

Obrigado desde já.

Link to comment
Share on other sites

É o seguinte, estou a receber dados (em python) de um dispositivo externo, e a minha taxa é de 1000 registos por segundo.

Qual é o intervalo entre recepção de dados ? Uma coisa é receber um bloco de 1000 registos a cada segundo, outra muito diferente é receber um registo a cada milisegundo.

Convém ter presente que o Python é uma linguagem interpretada, que não se presta a latências muito curtas. Mas tem a grande vantagem de ser fácil integrar extensões em C ou C++ que podem, essas sim, ter latências curtas.

Link to comment
Share on other sites

Guest user14912

Certo, o software que construí recebe 1000 registos por segundo, sendo eles 1 por milisegundo.

Conseguirei fazer essa amostragem sem muito delay? terei de fazer uma média dos registos tentado reduzir os registos para 1/2 ?

Aconselha-se o uso de threads para tal?

Peço desculpa o volume de respostas, mas quando tenho um projecto em mente gosto de o fazer "bem feito" e fazer as coisas em condições e também ouvir a opinião de pessoas mais experientes do que eu, que por sorte já tenham estado numa situação algo parecida à minha e cometido erros no qual que me possam alertar.

Obrigado 😄

Link to comment
Share on other sites

Certo, o software que construí recebe 1000 registos por segundo, sendo eles 1 por milisegundo.

Dizes que os dados vem dum dispositivo externo. Através de que interface ? USB ? Se fôr o caso o melhor talvez seja estudares a biblioteca libusb, que tem implementações para Windows e Linux e permite aceder a dispositivos USB. Também podes estudar a API WinUSB, que só funciona em Windows XP ou superior.

Conseguirei fazer essa amostragem sem muito delay? terei de fazer uma média dos registos tentado reduzir os registos para 1/2 ?

O problema não é o atraso, é mesmo que 1 milisegundo é um tempo muito curto para receber dados. Tipicamente o Windows tem uma latência na casa dos 5~10 milisegundos (ou seja, o tempo necessário para responder a um evento, seja qual fôr, como por exemplo receber dados dum interface externo). O Linux pode ter ainda maior (com kerneis normais) ou ligeiramente menor (com kernels RT). Imagina que recebes o primeiro dado; se o segundo chegar 1 ms depois muito dificilmente haverá tempo para o SO saltar do processo que estiver a executar para o teu, para receber o novo dado.

Aconselha-se o uso de threads para tal?

Sim, o mais simples seria ter uma thread a receber os dados e a metê-los num conjunto circular de buffers, que seriam depois lidos pelo código de apresentação a um ritmo muito mais baixo. Poderias fazer isso em Python criando uma extensão em C para receber e guardar os dados e fazer o resto do processamento em Python puro.

Mas mesmo bom seria fazeres 'buffering' do lado do dispositivo externo, de maneira a que enviasses p.e. 100 registos de cada vez, 10 vezes por segundo. Aí já conseguirias fazer tudo em Python.

Link to comment
Share on other sites

Continuando o que o bsccara disse, o melhor até seria apenas transmitires os dados 1x por segundo, pois assim não entupias os recursos do SO a fazer algo tão simples como aquisição de dados. Sem saber que tipo de dados (i.e., tamanho, variação entre eles, etc), é complicado dar-te algo mais concreto.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.