首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我的程序在任何进程中看到‘程序没有响应’和黑屏时-在Windows-7中

当我的程序在任何进程中看到‘程序没有响应’和黑屏时-在Windows-7中
EN

Stack Overflow用户
提问于 2010-11-12 04:37:22
回答 4查看 1.3K关注 0票数 1

当我的程序在任何进程中时(例如,加载csv文件)

我看到'program Not Responding'和黑屏-在Windows7中

在Windows-XP中我看不到它

(在此之后程序继续正常运行)

为什么会发生这种情况?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-12 04:44:20

当一个长进程运行时,如果它在UI线程上运行,这会导致应用程序不响应其他UI事件,最明显的是绘制屏幕。在Windows XP和Windows 7中,这将导致应用程序报告为“无响应”,但XP和Windows 7处理窗口绘画方式不同。

在XP中,应用程序实际上会更新屏幕,但在Windows7中,操作系统会保存当前屏幕的外观,然后使用不同的机制将其显示在屏幕上(例如,在启用Aero的情况下,它实际上会使用伪3D纹理显示窗口的内容)。

在7中,这可能会导致应用程序不响应显示黑色(或最后已知的灰色屏幕,取决于图形设置)屏幕(因为它没有任何最新信息)。而在XP中,它保留了旧的内容,但在它上面拖动一个窗口会导致该窗口的阴影显示在屏幕上,因为下面的窗口没有更新。

更新:

你怎么解决它呢?好吧,有很多不同的东西,但是如果你有一个需要很长时间的方法:

代码语言:javascript
复制
private void SomethingThatTakesAReallyLongTime()
{
    System.Threading.Thread.Sleep(30000);
}

您的事件处理程序可能如下所示:

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e)
{
    ((Action)SomethingThatTakesAReallyLongTime).BeginInvoke(null);
}

在许多情况下,这可能不是一个好主意,但这是一个可以尝试的简单示例。

票数 2
EN

Stack Overflow用户

发布于 2010-11-12 05:06:07

您将UI线程(主线程)占用了很长一段时间,这可能是因为操作很密集( CPU或磁盘)。尝试将密集型操作(比如读取文件)移到第二个线程中。这将使主线程(一个带UI的线程)对用户和操作系统做出响应。

有很多方法可以做到这一点。使用BackgroundWorker是最容易实现的。这应该可以让你入门了:http://msdn.microsoft.com/en-us/library/cc221403(VS.95).aspxr

从本质上讲,您将:

  1. 为DoWork事件创建一个backgroundWorker
  2. Create事件处理程序并将其连接到DoWork。
  3. 将CPU密集型操作放在DoWork事件处理程序中。
  4. 调用backgroundWorker的RunAsync()方法(这将阻止DoWork事件)

你可以在提供进度和允许用户取消时变得更加复杂。下面是一个加载大文件的示例:

http://msdn.microsoft.com/en-us/library/ms229675.aspx

票数 1
EN

Stack Overflow用户

发布于 2010-11-12 04:39:01

当您的主线程正在处理一个相对长时间运行的任务,因此无法重新绘制屏幕时,就会发生这种情况。你使用一个工作线程来加载csv (在这个例子中),你应该不会有这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4159023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档