These are my 2 classes. i am getting error is
Error:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
My 2 classes code:
using System;
using System.Windows.Forms;
using canlibCLSNET;
using System.Threading;
namespace CanDataThread
{
public partial class Form1 : Form
{
private static int handle;
private static int handleWrite;
private static int handleWrite1;
private static int handleWrite2;
private static Thread thread1;
private static Thread thread2;
private static Thread thread3;
private CanData dataHandler;
public Form1()
{
InitializeComponent();
dataHandler = new CanData();
}
private void Form1_Load(object sender, EventArgs e)
{
Canlib.canInitializeLibrary();
int channel = 0;
int channel1 = 1;
int channel2 = 2;
int channel3 = 3;
handle = Canlib.canOpenChannel(channel, Canlib.canOPEN_ACCEPT_VIRTUAL);
handleWrite = Canlib.canOpenChannel(channel1, Canlib.canOPEN_ACCEPT_VIRTUAL);
handleWrite1 = Canlib.canOpenChannel(channel2, Canlib.canOPEN_ACCEPT_VIRTUAL);
handleWrite2 = Canlib.canOpenChannel(channel3, Canlib.canOPEN_ACCEPT_VIRTUAL);
Canlib.canSetBusParams(handle, Canlib.canBITRATE_250K, 0, 0, 0, 0, 0);
Canlib.canSetBusParams(handleWrite, Canlib.canBITRATE_250K, 0, 0, 0, 0, 0);
Canlib.canSetBusParams(handleWrite1, Canlib.canBITRATE_250K, 0, 0, 0, 0, 0);
Canlib.canSetBusParams(handleWrite2, Canlib.canBITRATE_250K, 0, 0, 0, 0, 0);
Canlib.canBusOn(handle);
Canlib.canBusOn(handleWrite);
Canlib.canBusOn(handleWrite1);
Canlib.canBusOn(handleWrite2);
thread1 = new Thread(() => dataHandler.ReadCanData(handle, handleWrite, richTextBox1));
thread2 = new Thread(() => dataHandler.ReadCanData(handle, handleWrite1, richTextBox2));
thread3 = new Thread(() => dataHandler.ReadCanData(handle, handleWrite2, richTextBox3));
thread1.Start();
thread2.Start();
thread3.Start();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{ }
}
}
using System;
using canlibCLSNET;
using System.Windows.Forms;
namespace CanDataThread
{
public class CanData
{
private static int HexConvert(string z)
{
int m = Convert.ToInt32(z, 2);
return m;
}
public void ReadCanData(int readHandle, int handleWrite, RichTextBox richTextBox)
{
Canlib.canStatus status;
Canlib.canStatus status1;
byte[] data = new byte[8];
int id, flags, dlc;
long timestamp;
try
{
while (true)
{
status = Canlib.canReadWait(readHandle, out id, data, out dlc, out flags, out timestamp, 100);
string idBinary = Convert.ToString(id, 2).PadLeft(29, '0');
string hex1 = idBinary.Substring(0, 3);
string hex2 = idBinary.Substring(3, 18);
string hex3 = idBinary.Substring(21, 8);
int h1 = HexConvert(hex1);
int h2 = HexConvert(hex2) + 1;
int h3 = HexConvert(hex3);
int combinedID = (h1 << 26) | (h2 << 8) | (h3);
status1 = Canlib.canWrite(handleWrite, combinedID, data, data.Length, Canlib.canMSG_EXT);
if (status == Canlib.canStatus.canOK && status1 == Canlib.canStatus.canOK)
{
richTextBox.Invoke(new Action(() =>
{
richTextBox.AppendText($" {id} {data[0]:x2} {data[1]:x2} {data[2]:x2} {data[3]:x2} {data[4]:x2} {data[5]:x2} {data[6]:x2} {data[7]:x2}\n");
richTextBox.AppendText($" {h1:X} {h2:X} {h3:X} {data[0]:x2} {data[1]:x2} {data[2]:x2} {data[3]:x2} {data[4]:x2} {data[5]:x2} {data[6]:x2} {data[7]:x2}\n");
richTextBox.SelectionStart = richTextBox.Text.Length;
richTextBox.ScrollToCaret();
}));
}
else if (status != Canlib.canStatus.canERR_NOMSG)
{
MessageBox.Show($"Error reading or writing CAN message");
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
}
}
}
Thanks!