Boas pessoal,
na continuação do projecto em que tenho vindo a trabalhar (módulos RF, MySQL, gráficos online), hoje trago-vos mais uma questão caso possam ajudar.
Tenho já em funcionamento uma aplicação em C# que lista as portas serie disponíveis e permite ligar à desejada e vai fazendo o parsing de uma sting recebida através da porta série algo do género "1,12,23,20" em que os campos sao o ID, Contador, temperatura, bateria.
A aplicação funciona mas assim que me ligo à porta o GUI deixa de estar acessível (eu sei, erro de novatos) no entanto o programa continua a funcionar e preenche a base de dados à medida que chegam novas strings.
A solução que encontrei para que o GUI não bloqueie foi o uso de threads. Criei uma pequena aplicação em linha de comandos para testar o seu funcionamento:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static SerialPort _port;
static private string dados;
public delegate void evento(object _port, EventArgs args);
public event evento OnNewString;
static void Main(string[] args)
{
_port = new SerialPort("COM4");
_port.BaudRate = 115200;
_port.DataBits = 8;
_port.Parity = Parity.None;
_port.StopBits = StopBits.One;
_port.ReadTimeout = 20000;
Console.WriteLine("inicio");
Thread readThread = new Thread(Read);
//_port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
_port.Open();
readThread.Start();
}
private static void Read(){
while (true)
{
Console.WriteLine("A ttar ler....");
string message = _port.ReadTo("\n");
Console.WriteLine("li {0} \n", message);
dados = message;
//OnNewString(_port, new EventArgs());
}
}
private static void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
{
Console.WriteLine("Evento " + dados);
}
}
}
O que queria fazer agora era lançar um evento, por exemplo "OnNewString" que informasse que a thread tinha uma nova string e posteriormente (na aplicação com GUI) fazer o update dos campos, no entanto nao estou a conseguir fazer nenhuma das duas coisas.
Se puderem ajudar ficaria bastante agradecido. Desde já obrigado,
Cumps, Mauro.