您的位置:程序门 -> .net技术 -> c#



多线程操作form控件的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


多线程操作form控件的问题[已结贴,结贴人:keynes]
发表于:2007-01-29 06:07:47 楼主
我用c#写的window   form的应用程序,其中使用了多个线程,由于线程的逻辑比较复杂,我使用了类来封装这些逻辑代码,然后调用,这其中我遇到了几个疑惑的问题,请教各位,谢谢,我在写这个程序之前从来没用过c#,而用mfc。
1、我在form1.cs的类里建立了几个public的函数,我在线程类中怎样调用到这些函数?总不能去new   form1()吧?也不能建立一个static的函数啊?
2、其次在线程类的代码中怎样给form中的控件赋值或者获取属性?由于无法访问到form.cs中的函数,自然也无法获取到控件的类了,很疑惑这个问题,难道真的要每次都要将这个控件传递给类的构造函数?
3、我在多个线程中都要对form的控件进行操作,怎样避免同时访问的问题?在c#中没有lock的功能?
发表于:2007-01-29 08:15:521楼 得分:0
treadstart   hello   =   new   treadstrat(调用的函数)
tread   newstread   =new   tread(hello   )
newstread.start();


发表于:2007-01-29 08:18:232楼 得分:20
使用委托:
主线程:
第一步:定义委托delegate
private   delegate   void   setconn(string   strconn);
private   setconn   mysetconn   =   null;
第二步:定义一个方法
private   void   disptext(string   strconn)
{
        textbox1.text   =   strconn;
}
第三步:初始化委托
mysetconn   =   new   setconn(this.disptext);
第四步:在工作线程中
this.invoke(mysetconn,   "把我显示在textbox1中,谢谢! ");
发表于:2007-01-29 08:37:313楼 得分:0
樓上正解,在線程中調用ui控件要用委托
发表于:2007-01-29 08:58:034楼 得分:0
delegate

啊     当时做测试中间件时,多亏   liujia   兄弟啊

发表于:2007-01-29 09:23:405楼 得分:50
to:其次在线程类的代码中怎样给form中的控件赋值或者获取属性?

楼上几位也提到了,用invoke..

举个例子,比如你在启动一个线程,在线程的方法中想更新窗体中的一个textbox..

类似:

using   system.threading;

//启动一个线程
thread   thread=new   thread(new   threadstart(dowork));
thread.start();

//线程方法
private   void   dowork()
{
        //其他操作
        //比如将界面的textbox内容设置一下
        this.textbox1.text= "我是一个文本框 ";
}

如果你像上面操作,在vs2005里是会有异常的...

正确的做法是用invoke..

改为如下:
//定义一个委托
public   delegate   void   myinvoke(string   str);
//更新界面的方法
private   void   updatetextbox(string   str);
{
          //更新
          this.textbox1.text=str;
}

//启动一个线程
thread   thread=new   thread(new   threadstart(dowork));
thread.start();

//线程方法
private   void   dowork()
{
        //其他操作
        //比如将界面的textbox内容设置一下
        myinvoke   mi=new   myinvoke(updatetextbox);
        this.begininvoke(mi,new   object[]{ "我是一个文本框 "});
}
发表于:2007-01-29 09:27:426楼 得分:20
to:我在多个线程中都要对form的控件进行操作,怎样避免同时访问的问题?在c#中没有lock的功能?


当然有,mfc中有的,c#中基本上都有...

我最常用的是互斥量,即mutex...

举个例子..

比如一段代码(或者某个共享资源),线程都有可能会调用,那如何来对其互斥访问呢,即某个时间点只允许一个线程对其进行操作?

//先实例化mutex
private   mutex   mx=new   mutex();


....
//在需要互斥访问的地方这样来用..
mx.waitone();
//需要互斥访问的代码(或者资源)
mx.releasemutex();
发表于:2007-01-29 09:28:557楼 得分:10
to:to:我在多个线程中都要对form的控件进行操作,怎样避免同时访问的问题?在c#中没有lock的功能?

对于这个问题,你当然也可以用lock..

for   example:

public   void   function()
{
        system.object   lockthis   =   new   system.object();
        lock(lockthis)
        {
                //   access   thread-sensitive   resources.
        }
}
发表于:2007-01-29 09:31:378楼 得分:0
to:我在form1.cs的类里建立了几个public的函数,我在线程类中怎样调用到这些函数?

你所谓的调用是什么意思?你用过mfc,mfc里要指定一个线程的过程函数,你这里说到的函数是指的过程函数,还是说在过程函数中还要具体调用的方法?


快速检索

最新资讯
热门点击