求助-急
我想在子线程接收服务器发送的信息然后在父线程创建窗体上画控件
直接画会有错误
尝试过定义一个事件,用子线程触发事件,调用画控件的方法,不好用
应该怎么弄啊
我想在子线程接收服务器发送的信息然后在父线程创建窗体上画控件
直接画会有错误
尝试过定义一个事件,用子线程触发事件,调用画控件的方法,不好用
应该怎么弄啊
解决方案 »
- winform中怎么设置默认焦点在一个textbox上
- C#正则<TR .....></TR>
- 一个C#问题
- 如何解决 IE5 下面 模式窗口点按钮都弹新窗口的bug ?《<base target="_self">无效,高手来来
- C# 服务程序DEBUG下正常,realease后,安装服务作为windows服务不正常
- 为什么用c# 做的浏览器打开网页链接是会调用ie
- 小菜鸟妹子求助---编程问题
- C# Winform DevExpress 界面出现内存不足
- 如何通过WMI来操作DNS?急,敬请高手!
- 快点过来救命啊
- 请问select语句中如何使用自定义函数
- WinFomr里的DataGridView行高度不准确
SendMessage, PostMessage
用事件可以实现。我做过。
这样弄:你把事件单独写个类,CEvent.cs
我的培训例程
class CEvent
{
#region 显示像素点坐标
public delegate void PixelPosition(int x, int y);
public static event PixelPosition eventPixelPos; public static void invokePixelPos(int x, int y)
{
eventPixelPos(x, y);
}
#endregion
}
在窗体的load中事件注册:
CEvent。eventPixelPos += new CEvent。eventPixelPos(showPixelPos);private void showPixelPos(int x, int y)
{
//do something;
}在某个子线程中,如果想调用的话,
CEvent。invokePixelPos(x,y);你试一下。
这时, 可以这样做, 有助于理解知识:
void threadfucntion()
{
// 拿到将要调用的代理示例
EventHandler d = _events[o] as EventHandler;
if (d == null)
return;
// 看看代理对应的函数所在的对象是否实现 ISynchronizeInvoke
// Winform 中 Control 实现了她, 因此所有控件都实现了
// 这个接口正是用于跨线程调用的
if (d.Target != null && d.Target is ISynchronizeInvoke)
{
// 如果是 control 子类, 则拿到接口
ISynchronizeInvoke isi = d.Target as ISynchronizeInvoke;
// 询问一下控件是否需要 marshal 调用
// Control 是如何判断的, 可以看看 Control 的代码, 总之, Control 自己会知道是否需要 marshal
if (isi.InvokeRequired)
// marshal 调用
isi.Invoke(d, new object[] { this, EventArgs.Empty });
else
// 不需要, 说明调用代码跟响应代码在同一线程中
d(this, EventArgs.Empty);
}
else
// 如果函数所在类对象没有实现 ISynchronizeInvoke, 则直接调用
d(this, EventArgs.Empty);
}