【问题标题】:Threading In a WinForm [closed]WinForm中的线程[关闭]
【发布时间】:2013-04-19 19:16:24
【问题描述】:

我的应用程序中的所有内容都按我想要的方式运行,但我真的不明白到底是怎么回事?我设置了几个线程来监控应用程序不时需要的一些资源。线程更新了几个标签,说“一切都好”或“哦”(不是真的,但你明白了)。我设置了 InvokeRequired 的测试,以确保它在创建标签的线程上执行并且一切正常。

我不明白的是......如果我在更新标签时输入文本框,我不应该看到我的输入有某种滞后,因为它在同一个线程上或至少必须实现一些代码,以便我可以继续输入我离开的地方?我的猜测是 Invoke 方法会处理一些事情,所以我可以在我离开的地方继续输入。

它正在工作,所以我不应该抱怨,但我不希望一个月后出现一些我真的不明白的错误。

【问题讨论】:

  • 你的问题是?
  • 没有看到一些代码,这是不可能明确回答的。但是,更新标签并不需要很长时间......它可能会在您的机器上以微秒的速度发生。
  • 如果我在 textbox1 中输入,那么 label1 和 label2 会更新,我的光标如何回到我离开的地方?标签更新后,文本框不再是活动控件吗?
  • 不 - 在标签中呈现文本不需要输入焦点。你会没事的 - 继续编码。
  • 感谢您的反馈

标签: multithreading winforms


【解决方案1】:

简短回答:没有什么可担心的。

说明:几乎所有现存的 GUI 系统,包括 WinForms,都是单线程的,因此不会同时发生任何事情,但也要考虑到大多数操作也非常快(甚至绘画)。

更好的解释是解释 GUI 消息循环是如何工作的,但我懒得解释它,但我会解释你说你不明白的部分。这是您在文本框中键入时的事件序列:

  1. 根窗口(通过其消息循环)接收到按键消息
  2. 按键消息从根窗口发送到文本框
  3. 文本框收到按键消息。文本框通过将新字符附加到其内部 Value 字符串来更新其内部状态。
  4. 文本框通知父窗口该文本框需要在下一个最近的机会重新绘制,因为它的文本值已更改。
  5. 根窗口收到下一条消息:这是执行方法调用的请求(因为从另一个线程调用了Invoke 或BeginInvoke)。
  6. 根窗口执行此调用方法。
    1. 在这种情况下,你的Invoke'd 代码,据我所知,只是设置标签的Text 属性,这个操作很快,因为它只是设置标签的内部状态,它确实不会导致它被直接绘制,而是(如第 4 步),它会将标签标记为“无效”,并且必须在下一个最佳时机重新绘制(参见第 8 步)。
  7. 根窗口收到下一条消息:请求重绘文本框
  8. 根窗口指示文本框重新绘制自身
  9. 根窗口获取下一条消息,或处于空闲状态等待接收下一条消息

所以是的,有消息周期有延迟或延迟的可能性,例如,如果您的Invoke'd 代码需要超过几毫秒的时间才能执行。如果您在 Invoke 代码中添加 Thread.Sleep(10*1000),您会看到。

【讨论】:

  • 谢谢!这有帮助。我担心的是那些控制光标的更新会破坏线程的目的。 UI 将只是接收“工作”的结果,所以它会在一瞬间发生。对于笑容,我想我可以尝试更新一些“用户输入”控件,看看会发生什么。再次感谢您的反馈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多