我必须在代码中运行一个线程创建。 在form1中,我有一个按钮,运行新的单独线程以详细说明一些数据,所以我需要它来不冻结表单。
我已经使用了inizialized线程:
dim th as thread = new thread (addressof elaborate)
在button.click事件中:
th.isbackground= true
th.start()
现在,在表单加载中我已经将我的程序图标化,但是当我开始新线程时,托盘图标会从中复制。 我想解决这个问题,当开始新线程时,它不会显示新的通知图标。
有什么想法吗?
(我在网上找不到任何内容,只有Multiple notification icons appear when using multithreading)
答案 0 :(得分:0)
创建一个名为Elab的类 在那个类里面,放一个叫做work的子 将计时器添加到已禁用的表单
以千分之十表示
在表单类中声明:
Dim El as Elab
在Form_Load()中放置:
El = New Elab()
在你的按钮下,输入:
Dim gThread as new System.Threading.Thread(Address of El.Work)
Timer1.Enabled = True
Inside Elab声明一个名为Result的变量:
Public Result as boolean
当elab完成它正在做的任何事情时,将result设置为true,并将结果存储在稍后可以访问的公共变量中。
计时器内部:
If El.Result = True then
'Get results, deal with data
end if
这不是特别好写的,并不是一个工作的例子,但是通过给一个线程一个类的一个子地址,然后你可以访问同一个类,通常会指向正确的方向。从其他线程,这意味着您的表单不会冻结,并且您没有创建表单的新实例,您只是访问现有的类子例程;只要确保给自己一个获得结果的方法(在这个例子中,我建议一个计时器,但是一旦线程完成,“获得结果”按钮将完成相同的工作)。
Remeber: 如果您需要Elab在特定部分代码可以继续之前完成(例如,elab可能会添加两个数字,并且您需要继续执行结果),您可以启动该线程并执行此操作:
Do until El.Result = True
Application.DoEvents()
System.Threading.Thread.Sleep(1)
Loop
gThread.Join()
希望这有点帮助。
所以问题的答案是:不要将你的sub放在一个表单中,而是将它放在一个可以创建实例的类中。