【问题标题】:Visual C Multi-Threading (Please Help)?Visual C 多线程(请帮助)?
【发布时间】:2013-01-22 22:57:36
【问题描述】:

我编写了一个 .NET 程序,使用 Windows 窗体应用程序。 我的应用程序相当简单。 基本上,我的表单上有两个简单的按钮。 首次加载表单时,我设置了一个全局变量(bool run = true)。

我的第一个按钮本质上是一个非常简单的 while 循环。

while(run) { // do some code }

我想要做的是让第二个按钮将布尔值设置为 false(bool run = false)。

但是,一旦我点击了第一个按钮,我什至无法触摸第二个按钮!

我已经阅读了很多关于此的内容,我认为我的解决方案是使用多线程。 我在网上找到了一些用于多线程的示例代码,我试图将它们合并,但我不知道为什么我不能让它工作。一旦我点击按钮 #1,我就无法点击按钮 #2。

【问题讨论】:

  • 你不能在 UI 线程上这样做。你想完成什么?
  • 你的代码应该响应事件,而不是循环直到事情发生。
  • 嗯,通过一个按钮,我正在写入硬盘驱动器(使用 fwrite),通常取决于传输大小和硬盘驱动器的大小,此过程可能需要几分钟,这很好,我得到了那个部分的工作。但是,如果用户愿意,我希望用户能够停止该过程。而且,我不知道该怎么做,因为只要该过程(按钮#1)进行,我就无法触摸表单上的任何其他内容。而且,我想要的只是能够在第一个按钮仍在运行时单击第二个按钮。

标签: multithreading visual-c++


【解决方案1】:

您的 UI 线程不应该有任何无限或等待的东西 - 永远不会!您不得阻止 UI 进行任何操作(除了简单的计算、验证、用户确认等)。您应该创建一个线程来执行长度任务,并让该线程使用异步(或同步,如果您愿意)通信与 UI 线程通信。

在本机 Windows GUI 应用程序上,您可以使用 PostMessage (async) 或 SendMessage (sync)。对于 .NET GUI 应用程序,您可以使用 Control.BeginInvoke (async) 或 Control.Invoke (sync)。

read this article 了解这是如何完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多