为什么在一个线程中不能调用显示另一个窗体?

为什么在一个线程中不能调用显示另一个窗体?另一个窗体利用Timer控件控制,像MSN的消息提示一样显示出来。请问如果要显示这个窗体应该用什么方法?我将源代码传上。谢谢15:11:51
在码农的生活,很多级码农都有这样的经历,会被一个小小的技术问题拦住,然后进度跟不上了,被老板XXXX一大通了。心情不爽了。 好吧,这个曾经是我遇到拦路虎之一。但事实上不是什么大技术。技术就是一层纸,破了就破了。 这是一个关于如何跨窗体操作控件或过程的一个例子。比如,你想用窗体A的按键来执行窗体B的文本框变色。 Imports System Imports System.Threading Imports System.Text Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load CheckForIllegalCrossThreadCalls = False '不写这行,会出错,不允许线程的数据写到TextBox1.Text 去。 Form2.Show() End Sub Private Sub form1_FormClosing(sender As Object, e As EventArgs) Handles Me.FormClosing ' If runThread.IsAlive = True Then runThread.Abort() End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '用的是委托方式 Me.Invoke(New MethodInvoker(AddressOf THREAD2)) End Sub Private Sub THREAD2() Static j As Integer j = j + 1 TextBox1.Text = " 这是 [线程] 操作" & vbCrLf & _ " Button2被点了: " & j & " 次" & vbCrLf & "要求是from2.textbox.text= textbox1.text 。[问题]但为什么不能成功显示呢?" End Sub Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged Form2.TextBox1.Text = TextBox1.Text End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Static j As Integer j = j + 1 TextBox1.Text = " 这是 [非线程] 操作" & vbCrLf & _ "Button3 点击了: " & j & " 次" & vbCrLf & _ "要求是from2.textbox.text= textbox1.text, 可以成功显示,这个是对的。" End Sub End Class
### 回答1: 是的,在 Qt ,主窗体和它创建的子窗体的信号槽都共用同一个线程。这意味着,当你在主窗体或子窗体连接的信号被触发时,槽函数都将在同一个线程调用。 如果你想要在不同的线程运行这些信号槽,你可以使用 Qt 的信号槽机制来实现。 Qt 的信号槽机制允许你在不同的线程触发信号并在另一个线程调用槽函数。 如果你想要了解更多关于 Qt 的信号槽和线程的信息,你可以参考 Qt 文档关于信号槽和多线程的部分。 ### 回答2: 在Qt,信号-槽机制可以用于不同对象之间的通信。默认情况下,信号和槽是在同一个线程执行的。对于主窗体创建的子窗体,它们的信号和槽将共用同一个线程,即主窗体所在的线程。 这是因为在Qt,每个QObject派生类对象都有一个线程关联属性。当一个对象被创建时,默认情况下,它的线程关联属性与创建它的线程相同。因此,在主窗体创建的子窗体将自动继承主窗体所在的线程关联属性。 当子窗体创建后,如果在其信号和槽的连接没有明确指定一个特定的线程,则会使用默认的连接方式,也就是信号和槽将在同一个线程执行。这意味着,如果在主窗体的信号连接到子窗体的槽,它们将在同一个线程执行,即主窗体所在的线程。 然而,需要注意的是,Qt还提供了一些其他的连接方式,如Qt::DirectConnection和Qt::QueuedConnection等。这些连接方式可以通过明确指定连接类型来改变信号和槽之间的线程关系。因此,如果通过特定的连接方式将信号连接到槽,它们可能会在不同的线程执行。 综上所述,Qt窗体创建的子窗体的默认信号槽是共用同一个线程的。但通过特定的连接方式,可以改变信号和槽之间的线程关系。 ### 回答3: 在Qt,主窗体和子窗体的信号槽可以共用同一个线程,也可以使用不同的线程。 如果主窗体和子窗体属于同一个线程,它们之间的信号槽是直接连接的,事件的传递是在同一个线程完成的。这种情况下,当信号被触发时,槽函数将立即执行,不需要进行线程切换。 然而,在某些情况下,主窗体和子窗体可能属于不同的线程。例如,如果子窗体是在一个新的线程创建的,或者通过Qt的多线程机制(如QtConcurrent)创建的。这种情况下,当信号被触发时,Qt会使用事件循环将信号传递到子窗体所属的线程执行相应的槽函数。这个过程涉及线程切换和事件传递的机制,确保槽函数在正确的线程执行。 无论主窗体和子窗体是否共用同一个线程,Qt都提供了灵活的信号槽机制来实现跨线程的通信。通过Qt的线程间通信机制,我们可以在不同线程之间传递信号和槽的参数,并确保线程安全。这使得在多线程应用程序实现复杂的交互成为可能。 综上所述,Qt窗体和子窗体的信号槽可以共用同一个线程,也可以使用不同的线程,具体取决于应用程序的需求和设计。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值