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



问一线程小问题


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


问一线程小问题[已结贴,结贴人:banzhiyanz]
发表于:2007-05-25 11:57:19 楼主
我在form1的窗体上拖了一个panel的控件

之后怎么可以在线程的那个函数里对这个panel控制呢?

        private   sub   btnthread_click(byval   sender   as   system.object,   byval   e   as   system.eventargs)   handles   btnthread.click
                dim   t   as   new   thread(addressof   tt)
                t.start()

        end   sub

        private   sub   tt()
                dim   s()   as   string   =   split(pai_a,   ", ")
                dim   ub   as   integer   =   ubound(s)   -   1
                dim   i   as   integer
                dim   str   as   string   =   " "
                str   =   s(ub)
                dim   ss   as   string
                ss   =   replace(pai_a,   str   &   ", ",   " ")
                msgbox(pai_a)
                msgbox(ss)
                show_buke(ss,   790,   10,   panela)
        end   sub


刚接触这个内容,很新对我来说
发表于:2007-05-25 14:54:191楼 得分:15
使用委托即可。
看看我在这个帖子里怎么使用多线程来控制两个标签移动的代码吧。

http://community.csdn.net/expert/topicview3.asp?id=5557018
发表于:2007-05-25 15:00:592楼 得分:0
要用异步委托,因为窗体上的控件是不支持跨线程访问的。
可以在form上面写一个方法来操作panel,然后在线程里面通过begininvoke调用这个方法。
发表于:2007-05-26 13:40:373楼 得分:0
imports   system.threading
public   class   form3
        dim   t1,   t2   as   threading.thread
        private   delegate   sub   run1(byval   reset   as   boolean)
        private   delegate   sub   run2(byval   reset   as   boolean)

        private   sub   form3_load(byval   sender   as   system.object,   byval   e   as   system.eventargs)   handles   mybase.load
                t1   =   new   threading.thread(addressof   sub1)   :   t1.start()
                t2   =   new   threading.thread(addressof   sub2)   :   t2.start()

        end   sub

        private   sub   form3_formclosing(byval   sender   as   system.object,   byval   e   as   system.windows.forms.formclosingeventargs)   handles   mybase.formclosing
                t1.abort()       ' ' ' ' '关闭窗口时,放弃线程的运行
                t2.abort()
        end   sub
        private   sub   move1(byval   reset   as   boolean)     ' ' ' ' ' ' '移动
                if   reset   then   label1.left   =   0   else   label1.left   +=   1
        end   sub

        private   sub   move2(byval   reset   as   boolean)   ' ' ' ' ' ' '移动
                if   reset   then   label2.left   =   me.width   else   label2.left   -=   1
        end   sub

        private   sub   sub1()
                do
                        if   label1.left   <   me.width   then
                                me.invoke(new   run1(addressof   move1),   false)
                        else
                                me.invoke(new   run1(addressof   move1),   true)
                        end   if
                        threading.thread.sleep(10)
                loop
        end   sub

        private   sub   sub2()
                do
                        if   label2.left   >   0   then
                                me.invoke(new   run2(addressof   move2),   false)
                        else
                                me.invoke(new   run2(addressof   move2),   true)
                        end   if
                        threading.thread.sleep(10)
                loop
        end   sub
end   class


-----------------
这段代码是wzuomin()   的,运行后没一点问题

我就想问下
private   delegate   sub   run1(byval   reset   as   boolean)  
1.这个里的run1这个是个函数吧?
2.为什么他没有函数体呢?就是为什么没有说怎么个过程呢?   me.invoke(new   run1(addressof   move1),   true)在这里就直接用了?那他怎么就知道这个是做什么的呢???

请原谅我这个白痴问题
发表于:2007-05-26 14:26:434楼 得分:0
me.invoke(new   run1(addressof   move1),   true)

这里传递了两个值?不是就能传递一个object的吗?

private   delegate   sub   run1(byval   reset   as   boolean)     是一个真假的传递

可是怎么传递了是一个函数的名字呢?

发表于:2007-05-26 14:47:235楼 得分:0
还请wzuomin()   和其他的知道的朋友指点一二在下呀

不胜感激
发表于:2007-05-26 15:42:106楼 得分:0
学习中
发表于:2007-05-26 16:47:237楼 得分:0
找了一下午的资料,大体上有个模糊的概念
但是还是应该不准确的,所以还请高手指点

一:delegate   定义了个指向函数的指针,这样就需要一个方法的参数比如这里run2(addressof   move2)

二:既然delegate定义了   那么就要有个让他被指定的方法,当然这个方法要和这个delegate的一切类型一样,比如,返回值,参数类型,参数数量:比如
private   delegate   sub   run1(byval   reset   as   boolean)
private   sub   move1(byval   reset   as   boolean)

三:而这里就要在move1里写下任何的操作了

四:既然一切都准备好了,那么就要对他使用了,就要实例化了

在我找的资料好象是这个调用delegate的方法的过程好象是要自己写
不过在这里好象变成了自带的了??
比如:me.invoke(new   run2(addressof   move2),   false)
第一个参数是实例化后的参数,第二个是好象给这个delegate类型函数的参数吧??


以上都是个人遇见,还请高手出来指点!!!


快速检索

最新资讯
热门点击