Answer the question
In order to leave comments, you need to log in
C#, this.textBox1.AppendText not executed, different thread?
Good afternoon!
I encountered such a problem, when the event is triggered, the form element: this.textBox1.AppendText(m + Environment.NewLine);
Does not do anything, more precisely, does not display the variable m on the form , although it contains a string value during step-by-step verification, but its result is not displayed.
Now the essence of the code:
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.IO;
using System.IO.Ports;
//делегат для работы с событием
delegate void MessageDelegate();
namespace testGenerator
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//получаем все порты доступные в системе
string[] ports = SerialPort.GetPortNames();
//очищаем бокс
comboBox1.Items.Clear();
//добавляем в comboBox все найденные порты для выбора
comboBox1.Items.AddRange(ports);
}
//функция вывода сообщения полученного из COM порта
public void writeTB1(string m)
{
this.textBox1.AppendText(m + Environment.NewLine);
}
//инициализация нужного порта
private void button2_Click(object sender, EventArgs e)
{
var port = new MySerialPort();
port.Open(comboBox1.SelectedItem.ToString());
}
//тут пойдет взаимодейсвие с com портом
public class MySerialPort : SerialPort
{
private int _stepIndex;
private bool _startRead;
public MySerialPort()
:base()
{
//base.PortName = port;
base.BaudRate = 9600;
base.DataBits = 8;
base.StopBits = StopBits.One;
base.ReadTimeout = 1000;
//Подписываемся на событие прихода данных в com порт
base.DataReceived += new SerialDataReceivedEventHandler(MySerialPort_DataReceived);
}
public void Open(string portName)
{
if (base.IsOpen)
{
base.Close();
}
base.PortName = portName;
base.Open();
}
//событие прихода данных в буфер com порта
void MySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
EventAnswer eventAnswer = new EventAnswer();
AnswerCsw answerCsw = new AnswerCsw();
eventAnswer.Send += new MessageDelegate(answerCsw.AnswerEvent);
var port = (SerialPort)sender;
try
{
int buferSize = port.BytesToRead;
byte[] _buffer = new byte[buferSize];
_stepIndex = 0;
for ( int i=0; i < buferSize; i++)
{
byte bufferReadBt = (byte)port.ReadByte();
_buffer[_stepIndex] = bufferReadBt;
++_stepIndex;
char rbt = Convert.ToChar(bufferReadBt);
//Запись полученного текста в переменную text класса answer
AnswerCsw.AnswerText += Convert.ToString(rbt);
//если мы собрали все байты из буфера COM порта то вызываем событие DoEvent();
if (_stepIndex == buferSize)
{
eventAnswer.DoEvent();
AnswerCsw.AnswerText = null;
}
}
}
catch { }
}
}
//класс для ответа
class AnswerCsw : Form1
{
//сюда складываются конвертированные байтики из порта
public static string AnswerText;
//ну и собственно по приходу события сама функция которая должна отправить собранную
//строку в необходимый мне textbox
public void AnswerEvent()
{
writeTB1(AnswerText);
}
}
//событие для отправки ответа, когда все байты уложенны в AnswerText
class EventAnswer
{
public event MessageDelegate Send;
public void DoEvent()
{
Send();
}
}
}
public static string AnswerText;
if (_stepIndex == buferSize)
{
eventAnswer.DoEvent();
AnswerCsw.AnswerText = null;
}
class EventAnswer
{
public event MessageDelegate Send;
public void DoEvent()
{
Send();
}
}
eventAnswer.Send += new MessageDelegate(answerCsw.AnswerEvent);
class AnswerCsw : Form1
{
//сюда складываются конвертированные байтики из порта
public static string AnswerText;
//ну и собственно по приходу события сама функция которая должна отправить собранную
//строку в необходимый мне textbox
public void AnswerEvent()
{
writeTB1(AnswerText);
}
}
public void writeTB1(string m)
{
this.textBox1.AppendText(m + Environment.NewLine);
}
Answer the question
In order to leave comments, you need to log in
You have a bad application architecture.
Let me explain and then give an example.
1) MySerialPort must emit events.
2) The main window where this object is created must subscribe to the event. (In principle, anyone can subscribe, but in your case it is the main window)
3) When the necessary data is received, the MySerialPort class must send an event.
4) The main window received the data and displayed it on the screen.
Now how to do it:
In a separate file
DataCompleadEventArgs.csdescribe the event class:
namespace MyNamespace
{
public delegate void DataCompleadEventHandler(object sender, DataCompleadEventArgs e);
public class DataCompleadEventArgs : EventArgs
{
private string _data;
public DeviceEventArgs (string data)
{
_data; = data
}
public string Data
{
get { return _data; }
}
}
}
MySerialPortwrite the following:
public class MySerialPort : SerialPort
{
// ваш код ...
// обьявляете событие
public event DataCompleadEventHandler DataComplead;
// описываете функцию, чтоб слать событие наружу
private void OnDataComplead(string message)
{
if (DataComplead != null)
{
DataComplead(this, new DataCompleadEventArgs(message));
}
}
public MySerialPort() :base()
{
// ваш код ...
base.DataReceived += new SerialDataReceivedEventHandler(MySerialPort_DataReceived);
}
void MySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// то, что тут было написано не нужно !!!
var port = (SerialPort)sender;
try
{
// ваш код ...
var message = Convert.ToString(rbt);
if (_stepIndex == buferSize)
{
// шлём событие наружу
OnDataComplead(message );
}
}
catch { }
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// ...
}
private void button2_Click(object sender, EventArgs e)
{
var port = new MySerialPort();
// подписиваемся на событие
port.DataComplead += OnDataCompleated;
port.Open(comboBox1.SelectedItem.ToString());
}
private void OnDataCompleated(object sender, DataCompleadEventArgs e)
{
// получаем нужные данные
var message = e.Data;
writeTB1(message);
}
}
you can try wrapping it in a MethodInvoker, it helps me in 99% of cases
BeginInvoke(new MethodInvoker(delegate
{
textBox1.AppendText("The program has completed its work!");
//this can be any code
}));
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question