maurosmartins Posted September 26, 2012 at 10:57 PM Report #476707 Posted September 26, 2012 at 10:57 PM (edited) Viva pessoal, tenho andado a tentar fazer um programa que receba dados na porta serie e os escreva numa base de dados MySQL. de momento já consigo fazer as duas coisas em separado, no entanto nao sei como as posso integrar. o que tenho até ao momento é o seguinte; #include "stdafx.h" #include <iostream> #include <conio.h> #using <System.dll> #using <mscorlib.dll> using namespace std; using namespace System; using namespace System::IO::Ports; using namespace System::Net; using namespace System::Net::Sockets; using namespace System::Threading; using namespace MySql::Data::MySqlClient; ref class PortDataReceived{ public: static void Main(){ SerialPort^ mySerialPort = gcnew SerialPort("COM27"); mySerialPort->BaudRate = 28800; mySerialPort->Parity = Parity::None; mySerialPort->StopBits = StopBits::One; mySerialPort->DataBits = 8; mySerialPort->Handshake = Handshake::None; mySerialPort->DataReceived += gcnew SerialDataReceivedEventHandler(DataReceivedHandler); mySerialPort->Open(); String^ MyConString = "SERVER=.....;" + "UID=root;" + "PASSWORD=.....;"; MySqlConnection ^conSQL = gcnew MySqlConnection(MyConString); MySqlCommand ^myCommand = gcnew MySqlCommand(); myCommand->Connection=conSQL; conSQL->Open(); myCommand->CommandText = "use measures;"; myCommand->ExecuteNonQuery(); //myCommand->CommandText = "INSERT INTO measures (measure,timedate,deviceID,measuretypeID) VALUES(2.222225,now(),1,1);"; //myCommand->ExecuteNonQuery(); while(1){ Thread::Sleep(100); Console::Write("ALIVE"); } conSQL->Close(); mySerialPort->Close(); } private: static void DataReceivedHandler(Object^ sender, SerialDataReceivedEventArgs^ e){ SerialPort^ sp = (SerialPort^)sender; //cria um ponteiro para o objecto de onde proveio o evento! //neste caso do mySerialPort String^ indata = sp->ReadExisting(); Console::Write("{0}",indata); myCommand->CommandText = "INSERT INTO measures (measure,timedate,deviceID,measuretypeID) VALUES(2.222225,now(),1,1);"; myCommand->ExecuteNonQuery(); } }; int main(array<System::String ^> ^args){ PortDataReceived::Main(); } o problema (devem encontrar vários 🙂 ) é que no evento que processa a chegada de dados na porta série não posso usar a ligação que já defini antes. pelo que li acho que tenho de usar delegates? sinceramente nao sei o que sao 😕 nem se é o caminho a seguir. se me puderem dar ideias de como fazer isto agradecia, e claro se tiverem reparos a fazer ao código que apresentei tb agradecia. Obrigado, Mauro. Edited September 27, 2012 at 12:42 AM by Baderous geshi
HappyHippyHippo Posted September 26, 2012 at 11:24 PM Report #476712 Posted September 26, 2012 at 11:24 PM ref class PortDataReceived{ static void Main(){ // ... MySqlCommand ^myCommand = gcnew MySqlCommand(); // ... } static void DataReceivedHandler(Object^ sender, SerialDataReceivedEventArgs^ e){ // ... myCommand->CommandText = "INSERT INTO measures (measure,timedate,deviceID,measuretypeID) VALUES(2.222225,now(),1,1);"; // ... } }; é impossivel usar o objecto criado numa função noutra !! isso deverá dar erro de compilação a dizer que o objecto não está definido na segunda função .... como não conheço essas bibliotecas (assim como só de olhar para <conio.h> me dá voltas ao estomago) só poderei dizer: terás de abrir a ligação à base de dados em cada chamada do DataReceivedHandler ou arranjar uma maneira de teres a ligação disponível para as duas. a maneira mais comum é o uso do singleton static MySqlConnection^ connSingleton(bool close = false) { static MySqlConnection^ singleton = NULL; if (close) { if (singleton != NULL) // fechar a ligação return NULL; } if (singleton != NULL) return singleton; // abrir a ligação à base de dados } algo deste genero IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
maurosmartins Posted September 27, 2012 at 08:12 AM Author Report #476731 Posted September 27, 2012 at 08:12 AM Olá HappyHippyHippo, mais uma vez obrigado pela resposta. A verdade é que a unica linguagem que realmente conheço é o C o resto vou inventando 😕 dai o "conio.h" me ser familiar. é impossivel usar o objecto criado numa função noutra !! isso deverá dar erro de compilação a dizer que o objecto não está definido na segunda função .... Sim dá erro de compilação, precisamente porque diz que nao está definida, eu tinha ideia disso, só não sei como resolver. Não há possibilidade de definir o objecto de ligação à base de dados como sendo global à classe? terei de procurar o que são singleton, não faço ideia de qual a sua função. Cumprimentos, Mauro.
pikax Posted September 27, 2012 at 08:19 AM Report #476732 Posted September 27, 2012 at 08:19 AM Não há possibilidade de definir o objecto de ligação à base de dados como sendo global à classe? terei de procurar o que são singleton, não faço ideia de qual a sua função. Podes, basta declarares a variavel fora do scope da funcao e dentro do scope da class. A funcao de um singleton e' teres so' uma instancia da class inicializada durante a aplicacao, normalmente um singleton tambem implementa um lazy initialization(que significa que a variavel so' ira' ser inicializada quando for chamada a primeira vez) Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
HappyHippyHippo Posted September 27, 2012 at 08:19 AM Report #476733 Posted September 27, 2012 at 08:19 AM (edited) Não há possibilidade de definir o objecto de ligação à base de dados como sendo global à classe? sim, podes declarar a variável a nível global. no entanto não gosto dessa solução, assim como sai fora do paradigma OO. Podes, basta declarares a variavel fora do scope da funcao e dentro do scope da class. nop. as funções estão declaradas como estáticas, logo não existe instanciação da classe, que por consequência não existe variável da classe. tem de ser mesmo a nível global e não da classe. Edited September 27, 2012 at 08:21 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pikax Posted September 27, 2012 at 08:33 AM Report #476735 Posted September 27, 2012 at 08:33 AM nop. as funções estão declaradas como estáticas, logo não existe instanciação da classe, que por consequência não existe variável da classe. tem de ser mesmo a nível global e não da classe. Nem tinha reparado que as funcoes estavam declaradas como estaticas, sendo assim o melhor seria criar um singleton. Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
maurosmartins Posted September 27, 2012 at 09:17 AM Author Report #476742 Posted September 27, 2012 at 09:17 AM Bons dias, obrigado pelas vossas respostas. então resumindo as minhas possibilidades: Se quiser ter uma solução intermédia mas que no entanto nao respeita o paradigma das linguagens orientadas a objectos posso declarar a variavel a nivel global do programa. Alternativamente poderei declarar um singleton (terei de pesquisar), que vai ser uma instancia unica do objecto de ligação a base de dados. está correcto? Mauro.
maurosmartins Posted September 27, 2012 at 01:29 PM Author Report #476773 Posted September 27, 2012 at 01:29 PM (edited) Viva mais uma vez, andei a pesquisar um pco sobre singleton e na wikipedia aparece o seguinte http://pt.wikipedia.org/wiki/Singleton e o exemplo que dão até é com o acesso a uma base de dados, ou seja existir apenas uma instancia da classe que gere a manipulação da base de dados. o código em C++ que apresentam para declarar um singleton é o seguinte: class MyClass { private: // atributo estático da "instância única" static MyClass *instance = 0; //construtor privado, não pode ser utilizado fora da classe MyClass() {} public: // Função-membro que retorna sempre a mesma instância do objeto static MyClass& getInstance() { if (!instance) instance = new MyClass(); return *instance; } }; será que poderiam ajudar-me a adaptar o seu uso para o meu programa em particular? Obrigado, Mauro. (offtopic: é necessário fazer alguma coisa para que o código tenha o highlight da sintac conforme a linguagem usada? ) Edited September 27, 2012 at 01:30 PM by maurosmartins
HappyHippyHippo Posted September 27, 2012 at 01:41 PM Report #476774 Posted September 27, 2012 at 01:41 PM (edited) será que poderiam ajudar-me a adaptar o seu uso para o meu programa em particular? static MySqlConnection^ connSingleton(bool close = false) { static MySqlConnection^ singleton = NULL; if (close) { if (singleton != NULL) // fechar a ligação return NULL; } if (singleton != NULL) return singleton; // abrir a ligação à base de dados } (offtopic: é necessário fazer alguma coisa para que o código tenha o highlight da sintac conforme a linguagem usada? ) sim, além de usares a tags code terás de adicionar qual a linguagem na abertura das tags : code=cpp (falta obviamente os parênteses rectos) Edited September 27, 2012 at 01:42 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
maurosmartins Posted October 1, 2012 at 04:14 PM Author Report #477326 Posted October 1, 2012 at 04:14 PM (edited) Viva pessoal, HappyHippyHippo, ainda nao fechei esta minha questão. para ser sincero compreendo o conceito do singleton no entanto nao compreendo a sua implementação nem como usá-lo apesar do exemplo dado. Seria solução criar uma class onde existisse um elemento do tipo MySqlConnection declarado como estático e desta forma poderia aceder a ele em qualquer outra classe atraves de nomedaclasse::elemento? qual a vossa opinião? Cumps, Mauro. Edited October 2, 2012 at 08:38 AM by maurosmartins
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now