子线程安全Show窗口问题

LeonLincc 2010-08-21 04:01:26
是这样,主窗体上有一个按钮 showform 另一个窗体上什么都没

现在是想实现安全显示第二个窗体



private sub button1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.click
Dim bwThreadFrm As New BackgroundWorker
AddHandler bwThreadFrm.DoWork, AddressOf RunfrmBMGL
bwThreadFrm.RunWorkerAsync()
end sub

Private Sub RunfrmBMGL()
If iSmdichi("form2") Then
Exit Sub
End If
form2.showdialog(me)
End Sub

Private Function iSmdichi(ByVal chiformname As String) As Boolean
For Each chiform As Form In Me.MdiChildren
If chiform.Name = chiformname Then
If chiform.Visible Then
chiform.Activate()
Else
chiform.Show()
End If
Return True
End If
Next
Return False
End Function



现在有两个问题

1: form2.showdialog(me) 提示 不是该线程创建的控件,应该是说 me这个参数 ,如果不加 me 的话,无法实现从属关系,如何写这个 invoke??

2: Private Function iSmdichi(ByVal chiformname As String) As Boolean
这个过程貌似只能查找当前主线程内的窗口。。。我在子线程中创建的窗口无法查找到。
大家有什么好的方法改进呢?
...全文
134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeonLincc 2010-08-21
  • 打赏
  • 举报
回复
兄弟们,计时问题就不管了,帮我看看我的第一个问题咯
LeonLincc 2010-08-21
  • 打赏
  • 举报
回复

Private Declare Function GetTickCount Lib "kernel32" () As Int64
Dim count As Int64
Private timeTick As Thread
Private dateTick As New Date(1970, 1, 1)
Private Sub subTick()
While True
count = GetTickCount()
Thread.Sleep(333)
dateTick = dateTick.AddMilliseconds(GetTickCount - count)
SetTickLabelText(dateTick.ToString("HH:mm:ss"))
End While
End Sub

Delegate Sub SetTextCallback(ByVal text As String)
Private Sub SetTickLabelText(ByVal text As String)
If StatusTimer.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf SetTickLabelText)
Me.Invoke(d, New Object() {text})
Else
StatusTimer.Text = text
End If
End Sub


这是我的计时以及invoke的部分,我是看不出问题,运行也正常,事实上,主线程一卡,我子线程就会被影响到。
LeonLincc 2010-08-21
  • 打赏
  • 举报
回复
是的,我也觉得奇怪,因为我是用一个独立的子线程去计时的,然后用invoke来更新主线程上的时间,可是,事实上,主线程卡住两秒之后,我的计时也会被卡住两秒。。所以,我迫不得已用线程来show窗口
兔子-顾问 2010-08-21
  • 打赏
  • 举报
回复
事情分开说。
秒表本就不应该用timer累加,应该记录一个开始时间,然后timer中更新界面,如果界面卡住2秒,并不影响结果。跳过2秒继续跑秒不会有任何问题。
LeonLincc 2010-08-21
  • 打赏
  • 举报
回复
第二个问题的代码我还没做测试,不过应该能解决,我先去吃饭
LeonLincc 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyazhe 的回复:]

如果是只有一个Form2能显示,如果已经打开Form2窗体,则激活这样一个想法。

VB.NET code

Imports System.ComponentModel

Public Class Form1

Private Sub button1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) ……
[/Quote]


呀,这个思路我没想到,谢谢指点,第二个问题基本上可以用这个方法解决

但是,第一个问题,ShowDialog 是不需要参数的,但是可以增加参数

增加的参数是给子线程指定一个从属关系来的

比如说,主窗体在跑秒
子窗体显示的时候,因为工作量较大,会占用1,2秒的时间来执行代码
为了不影响主窗体执行,使用线程来显示窗口2

这样的情况下,就很有必要了

我一开始说的那个只是一个很简单的测试项目而已
兔子-顾问 2010-08-21
  • 打赏
  • 举报
回复
如果是只有一个Form2能显示,如果已经打开Form2窗体,则激活这样一个想法。


Imports System.ComponentModel

Public Class Form1

Private Sub button1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form2Instance.Show()
Form2Instance.Activate()
End Sub

Private f2 As Form2
Public ReadOnly Property Form2Instance() As Form2
Get
If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2()
Return f2
End Get
End Property

End Class

Public Class Form2
Inherits Form
End Class


不需要用多线程。

ShowDialog不需要参数

如果ShowDialog就会阻塞父窗体,这样多线程没有任何意义。
兔子-顾问 2010-08-21
  • 打赏
  • 举报
回复
你想实现什么

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧