我有一个带有进度条的表单(使用 VS2010 在 C# 中开发)。 这是一种秒表形式,我在 10 秒内填充进度条......随着时间的流逝,进度条相应地填充......意味着 5 秒后,进度条将填充 50% 等等......
我使用了一个 for 循环来执行这个操作:-
for(int count=0;count<200;count++)
{
progbar.performstep();
progbar.update();
update();
Thread.Sleep(50);
}
我使用了 50 毫秒的 Thread.Sleep,以便进度条顺利更新。 对于 1 秒,它会逐步增加。
问题是如果我执行任何其他操作,例如移动此表单或什至单击桌面上的另一个图标会使此表单“无响应”......但它会执行该操作并在 10 秒结束时恢复其状态并显示弹出窗口,指示 10 秒已过且进度条已满。
感谢您的帮助,很抱歉使用如此复杂的语言。
问候, 斯旺南
更新:我在下面的答案的帮助下解决了这个问题....我知道的一个常见错误是忘记了“Applications.DoEvents()” with "update()".....如果你输入这一行,被“吊死”的几率就会降低!
最佳答案
您正在 UI 线程上执行长时间运行的操作,这意味着 UI“消息循环”(负责处理用户输入和更新屏幕等事件)没有机会运行。
您应该在不同的线程(无论是您自己创建的线程还是后台线程)上执行长时间运行的操作,并使用 BackgroundWorker轻松更新进度条,或者在需要更新 UI 时使用 Control.Invoke/BeginInvoke 将委托(delegate)回调编码回 UI 线程。 (您不能从错误的线程更新控件。)
如果您唯一的 UI 交互是填写进度条,我建议使用 BackgroundWorker。
如果您不是真正在做“真正的”工作,只是在等待时间过去,您可以使用 System.Windows.Forms.Timer 而不是所有这些。这将在 UI 线程上“滴答”,但不会在滴答之间阻塞 UI 线程。你应该只在你没有很多工作要做的情况下使用它——如果它真的只是更新一个进度条,而不是(比如)处理一个文件等。请注意你不应该不要依赖计时器准确地“准时”触发 - 您可能应该根据观察到的时间而不是观察到的滴答数来设置进度条的位置。
关于c# - 在 C# 中执行任何其他操作时表单无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4919058/
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_