using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace ByteToString
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button5.Enabled = false;
} private void button1_Click(object sender, EventArgs e)
{
byte[] b = new byte[4];
b[0] = 0xaf;
b[1] = 0xae;
b[2] = 0xad;
b[3] = 0xac;
string strtotal = "";
// string strinter = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(b[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
richTextBox.AppendText(strtotal);
richTextBox.Focus();
} private void button2_Click(object sender, EventArgs e)
{
richTextBox.Clear();
} private void button3_Click(object sender, EventArgs e)
{
// this.Close();
// Application.Exit();
serialPort.PortName = "com8";
if (!serialPort.IsOpen)
{
serialPort.Open();
button3.Enabled = false;
button5.Enabled = true;
}
} private void button4_Click(object sender, EventArgs e)
{
byte[] buff=new byte[4]; buff[0]=0xaf; buff[1]=0xc4; buff[2]=0xed; buff[3]=0xfa;
string strtotal = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(buff[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// serialPort.WriteLine(strtotal);
if (serialPort.IsOpen)
serialPort.Write(buff, 0, 4);
} private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// serialPort
byte[] buffer = new byte[serialPort.ReadBufferSize];
// string str = "";
serialPort.Read(buffer, 0, serialPort.ReadBufferSize);
string strtotal = "";
// string strinter = ""; for (int x = 0; x < serialPort.ReadBufferSize; x++)
{
string sr = Convert.ToInt32(buffer[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
richTextBox.AppendText(strtotal);
richTextBox.Focus(); } private void button5_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
button3.Enabled = true;
button5.Enabled = false;
}
}
}
}
为什么使用串口接收时 函数richTextBox.AppendText(strtotal);
报错,提示“线程间操作无效: 从不是创建控件“richTextBox”的线程访问它。”错误,是不是应该使用委托?请问如果使用委托怎么搞?我还不会使用委托,麻烦哪位大虾给写出来贴一下!
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace ByteToString
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button5.Enabled = false;
} private void button1_Click(object sender, EventArgs e)
{
byte[] b = new byte[4];
b[0] = 0xaf;
b[1] = 0xae;
b[2] = 0xad;
b[3] = 0xac;
string strtotal = "";
// string strinter = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(b[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
richTextBox.AppendText(strtotal);
richTextBox.Focus();
} private void button2_Click(object sender, EventArgs e)
{
richTextBox.Clear();
} private void button3_Click(object sender, EventArgs e)
{
// this.Close();
// Application.Exit();
serialPort.PortName = "com8";
if (!serialPort.IsOpen)
{
serialPort.Open();
button3.Enabled = false;
button5.Enabled = true;
}
} private void button4_Click(object sender, EventArgs e)
{
byte[] buff=new byte[4]; buff[0]=0xaf; buff[1]=0xc4; buff[2]=0xed; buff[3]=0xfa;
string strtotal = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(buff[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// serialPort.WriteLine(strtotal);
if (serialPort.IsOpen)
serialPort.Write(buff, 0, 4);
} private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// serialPort
byte[] buffer = new byte[serialPort.ReadBufferSize];
// string str = "";
serialPort.Read(buffer, 0, serialPort.ReadBufferSize);
string strtotal = "";
// string strinter = ""; for (int x = 0; x < serialPort.ReadBufferSize; x++)
{
string sr = Convert.ToInt32(buffer[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
richTextBox.AppendText(strtotal);
richTextBox.Focus(); } private void button5_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
button3.Enabled = true;
button5.Enabled = false;
}
}
}
}
为什么使用串口接收时 函数richTextBox.AppendText(strtotal);
报错,提示“线程间操作无效: 从不是创建控件“richTextBox”的线程访问它。”错误,是不是应该使用委托?请问如果使用委托怎么搞?我还不会使用委托,麻烦哪位大虾给写出来贴一下!
解决方案 »
- 使用wcf传递json,实际上传递的就是字符串吗?我用不用给每一个传递项目都加上双引号?这个例子对吗?
- cache
- Panel这么才能响应鼠标的滚动
- 给讲一下如何返回字符串数组
- 大家认为下面的写法那种好,为什么?
- 请教一下在WinForm下用水晶报表的问题?
- 如何获取一个 第三方窗口 中的相关控件信息?
- 请问以下问题是否可以用正则表达式解决?怎么用?谢谢!
- c#中使用msflexgrid遇到的问题
- 用InstallShield LE发布的安装包无法打开
- 这个问题怎么解决啊 ??在关闭第三个窗口的时候更新第二个窗口上的数据
- devexpress xtragrid中哪个事件可以代替cellendedit?
(2)、偷懒的方法是在你的Form_Load事件中增加:
Control.CheckForIllegalCrossThreadCalls = false;
{
outPutBox.AppendText(msg);
outPutBox.ScrollToCaret();
}));
{
richTextBox.AppendText(str);
richTextBox.Focus();
}
地方报错了,还是从不是创建控件“richTextBox”的线程访问它。”请哪位高手看看,从哪里给我修正一下,能够使得这个接收并显示顺利!using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace ByteToString
{
public partial class Form1 : Form
{
/// <summary>
/// ///////////////////////////////////////////////////////////////
/// Delegate int SomeDelegate(string s, bool b);
/// </summary>
private delegate void sss(string str); private void SomeFunction(string str)
{
richTextBox.AppendText(str);
richTextBox.Focus();
} public Form1()
{
InitializeComponent();
button5.Enabled = false;
} private void button1_Click(object sender, EventArgs e)
{
byte[] b = new byte[4];
b[0] = 0xaf;
b[1] = 0xae;
b[2] = 0xad;
b[3] = 0xac;
string strtotal = "";
// string strinter = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(b[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
richTextBox.AppendText(strtotal);
richTextBox.Focus();
} private void button2_Click(object sender, EventArgs e)
{
richTextBox.Clear();
} private void button3_Click(object sender, EventArgs e)
{
// this.Close();
// Application.Exit();
serialPort.PortName = "com8";
if (!serialPort.IsOpen)
{
serialPort.Open();
button3.Enabled = false;
button5.Enabled = true;
}
} private void button4_Click(object sender, EventArgs e)
{
byte[] buff=new byte[4]; buff[0]=0xaf; buff[1]=0xc4; buff[2]=0xed; buff[3]=0xfa;
string strtotal = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(buff[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// serialPort.WriteLine(strtotal);
if (serialPort.IsOpen)
serialPort.Write(buff, 0, 4);
} private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// serialPort
byte[] buffer = new byte[serialPort.ReadBufferSize];
// string str = "";
serialPort.Read(buffer, 0, serialPort.ReadBufferSize);
string strtotal = "";
// string strinter = ""; for (int x = 0; x < serialPort.ReadBufferSize; x++)
{
string sr = Convert.ToInt32(buffer[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
// richTextBox.AppendText(strtotal);
// richTextBox.Focus();
//
///test sss sd = new sss(SomeFunction);
sd("somestring");
} private void button5_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
button3.Enabled = true;
button5.Enabled = false;
}
}
}
}
你不是定义了一个
private delegate void sss(string str); private void SomeFunction(string str)
{
richTextBox.AppendText(str);
richTextBox.Focus();
} 你不能直接调用sss
你应该这么写
this.Invoke(new sss(somefunction),new object[]{"XXX"});
{
Thread t = new Thread(showmessage);
t.Start();
} void showmessage()
{
this.Invoke(printExplicit, "测试");
} Action<string> printExplicit = (string s) => MessageBox.Show(s);
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace ByteToString
{
public partial class Form1 : Form
{
/// <summary>
/// ///////////////////////////////////////////////////////////////
/// Delegate int SomeDelegate(string s, bool b);
/// </summary>
private delegate void sss(string str); private void SomeFunction(string str)
{
richTextBox.AppendText(str);
richTextBox.Focus();
} public Form1()
{
InitializeComponent();
button5.Enabled = false;
} private void button1_Click(object sender, EventArgs e)
{
byte[] b = new byte[4];
b[0] = 0xaf;
b[1] = 0xae;
b[2] = 0xad;
b[3] = 0xac;
string strtotal = "";
// string strinter = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(b[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
richTextBox.AppendText(strtotal);
richTextBox.Focus();
} private void button2_Click(object sender, EventArgs e)
{
richTextBox.Clear();
} private void button3_Click(object sender, EventArgs e)
{
// this.Close();
// Application.Exit();
serialPort.PortName = "com8";
if (!serialPort.IsOpen)
{
serialPort.Open();
button3.Enabled = false;
button5.Enabled = true;
}
} private void button4_Click(object sender, EventArgs e)
{
byte[] buff=new byte[4]; buff[0]=0xaf; buff[1]=0xc4; buff[2]=0xed; buff[3]=0xfa;
string strtotal = ""; for (int x = 0; x < 4; x++)
{
string sr = Convert.ToInt32(buff[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// serialPort.WriteLine(strtotal);
if (serialPort.IsOpen)
serialPort.Write(buff, 0, 4);
} private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// serialPort
byte[] buffer = new byte[serialPort.ReadBufferSize];
// string str = "";
serialPort.Read(buffer, 0, serialPort.ReadBufferSize);
string strtotal = "";
// string strinter = ""; for (int x = 0; x < serialPort.ReadBufferSize; x++)
{
string sr = Convert.ToInt32(buffer[x]).ToString("X");
strtotal += sr + " ";
// strinter
}
// MessageBox.Show(strtotal);
// richTextBox.AppendText(strtotal);
// richTextBox.Focus();
//
///test sss sd = new sss(SomeFunction);
this.Invoke(new sss(SomeFunction), new object[] { "asdf" }); // sd("somestring");
} private void button5_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
button3.Enabled = true;
button5.Enabled = false;
}
}
}
}
其中最关键的一句是调用委托
this.Invoke(new sss(SomeFunction), new object[] { "asdf" });