当前位置:首页 » 密码管理 » c跨线程访问控件

c跨线程访问控件

发布时间: 2022-10-04 00:17:22

⑴ C#如何在线程中访问控件对象

利用ListView.Invoke解决跨线程安全调用,关键代码如下:

voidFindFileInDir(){
if(listView2.InvokeRequired)
{
//跨线程调用
listView2.Invoke(newMethodInvoker(delegate
{
listView2.Items.Add(path);
}));
}
else
{
//直接调用
listView2.Items.Add(path);
}
}//EndofFindFileInDir

⑵ c#如何跨线程调用窗体控件

要从其他跨线程存取调用控件,可采用以下两种方法之一:

方法1)不进行线程安全的检查

方法2)通过委托的方式

代码如下所示

publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
//方法1:不进行跨线程安全检查
//System.Windows.Forms.Control.=false;
}

privatevoidbutton1_Click(objectsender,EventArgse)
{
Threadth1=newThread(newThreadStart(CalNum));
th1.Start();
}

privatevoidCalNum()
{
//button1.Enabled=false;

intresult=0;
for(inti=1;i<100000000;i++)
{
result+=i;
}

SetCalResult(result);

//button1.Enabled=true;
}

//方法2:检查是否跨线程,然后将方法加入委托,调用委托
(intresult);
privatevoidSetCalResult(intresult)
{
if(label2.InvokeRequired==true)
{
SetTextHandlerset=newSetTextHandler(SetCalResult);//委托的方法参数应和SetCalResult一致
label2.Invoke(set,newobject[]{result});//此方法第二参数用于传入方法,代替形参result
}
else
{
label2.Text=result.ToString();
}
}
}

⑶ C#窗体程序中,为什么有时候直接跨线程使用控件也不会报错

直接跨线程使用控件 那是非线程安全,最好不用,尽量用委托吧

⑷ 虚心求教c#在其他类中跨线程调用form中的控件,如何实现呢

不建议在类中直接访问控件,这不符合低耦合的设计要求,有些正式项目维护很麻烦的,特别是跨线程。

下面用我自己的一个扫描枪项目举例

1、在你的业务类中定义事件委托,将要处理的参数通过事件传递给事件函数(如果你传递的数据较多,需要另外定义一个特定参数类,使用属性定义包含你要传递的数据)。

(objectSender,stringtext);//定义扫描事件的委托
;//定义扫描事件对象,该对象用于外部程序挂接事件响应函数
//定义一个发送事件的函数
(stringtext)
{
if(OnStartScanning!=null)
OnStartScanning(_Sender,text);//_Sender是调用该对象时传入的发生源,即某文本框控件,此处传回给事件处理(响应)函数,其中text为扫描到的并经过业务对象检查后的文本(条码)
}

2、在你的业务类中需要操作控件地方,通过事件发送函数触发事件,将参数发送给事件函数处理。

下面在窗口代码中定义

3、为事件响应函数定义一个异步委托,该委托由事件响应函数调用,实现跨线程访问窗口控件

private delegate void OnThreadStart(object sender);

4、实例化业务对象,定义一个为该对象服务的,处理窗口控件的事件响应函数。

=newScanningGunMonitor();
privatevoidProctScanMonitor_OnStartScanning(objectsender,stringText)
{
//这里是重点,自定义类对象的事件触发会导致与窗口不在一个线程,通过下面的代码进行异步访问重新访问自己
if(InvokeRequired)
{
OnThreadStartmydelgate=newOnThreadStart(ProctScanMonitor_OnStartScanning);
//异步的委托
this.Invoke(mydelgate,newobject[]{sender,Text});
return;
}

//窗口线程可执行的代码
TextBoxbox=(TextBox)sender;
box.Text=Text;
box.Select(box.TextLength,0);
}

5、在初始化的地方为该对象添加定义的事件响应函数,业务对象触发事件时会调用它。

ProctScanMonitor.OnStartScanning+=newScanningGunMonitor.StartScanning(ProctScanMonitor_OnStartScanning);//添加事件响应

⑸ c# 跨线程访问控件

用委托,具体代码如下~:
public delegate void MyInvoke(string str);

private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
// = false;
Thread t = new Thread(new ThreadStart(fun));
t.Start();
}

private void fun()
{
//_myInvoke("dddd");
SetText("ddd");
}
private void SetText(string s)
{
if (textBox6.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(SetText);
this.Invoke(_myInvoke, new object[] { s });
}
else
{
this.textBox6.Text = s;
}
}

⑹ c# 跨线程访问控件

我最近刚好在弄多线程采集,用委托解决

(stringtest);
publicvoidSetDtText(stringtext)
{
if(list_dt.InvokeRequired)
{
CjDbCallBackd=newCjDbCallBack(SetDtText);
this.Invoke(d,newobject[]{text});
}
else
{
list_dt.Items.Insert(0,text);
}
}

list_dt控件名

然后到处用就行了

⑺ C#跨线程调用控件,怎么用invoke返回值

获取控件的值需要用invoke方法吗?需要的话就用委托吧,不需要的话就直接获取控件的值

⑻ C++ MFC跨线程调用控件会出问题吗

线程调用函数是可以的.
不过需要注意,跨线程调用的函数中,如果使用了全局变量或者静态局部变量, 或者动态申请的资源.
或者在该函数调用的函数中使用了这类资源
那么会出现线程不安全现象,需要加锁.

⑼ c#中如何跨线程调用windows控件

在辅助线程调用(在创建辅助线程时可将此方法通过delegate传到辅助线程中)下面的方法InvokeControl();

//写在主线程中(windows控件)
private void InvokeControl()
{
if (this.InvokeRequired)
this.Invoke(new DelegateChangeText(ChangeText));
else
this.ChangeText();
}

private void ChangeText()
{
this.TextBox.Text = "sd";
}

public delegate void DelegateChangeText();

热点内容
湖人双核配置哪个最好 发布:2025-05-15 10:09:48 浏览:978
手机热点密码怎么查看 发布:2025-05-15 09:54:47 浏览:108
生意发力云存储 发布:2025-05-15 09:54:45 浏览:616
编写一个shell脚本添加用户 发布:2025-05-15 09:54:43 浏览:505
数据库查看表命令 发布:2025-05-15 09:52:27 浏览:914
p30是不是自带方舟编译器 发布:2025-05-15 09:51:48 浏览:599
追击世界房间密码是多少 发布:2025-05-15 09:51:46 浏览:995
cjavabyte 发布:2025-05-15 09:51:36 浏览:463
visa存储卡 发布:2025-05-15 09:35:07 浏览:619
js调用php的方法 发布:2025-05-15 09:29:13 浏览:496