我在使用可可开发的应用程序中偶然发现了一个问题。我需要做一些处理,并且我在一个单独的线程上进行。我这样做是为了可以使用 NSProgressIndicator 显示进度,而不是挂起主线程。(如果用户愿意,可以取消执行)。
它几乎工作完美,但有一个问题:处理过程会产生大量文件,如果这些文件中的一个或多个已经存在,我想询问用户是否可以在实际执行此操作之前覆盖它们。所以我尝试从处理线程使用 NSRunAlertPanel() 。
有时它会起作用。其他时候,警报面板会闪烁,在我点击它之前无特殊原因关闭,或者根本不出现。所以我认为 NSRunAlertPanel() 可能不是线程安全的,这是由于竞争条件而发生的。
我想知道:除了使用计时器不断轮询处理线程以了解主线程的进度之外,还有什么方法可以解决此问题?
从主线程以外的任何线程使用 GUI 本质上是不安全的吗?
提前致谢。
编辑:我正在按照马克的指示进行操作,但仍然有问题,因为我的 NSAlerts (我现在也在使用)仍然消失。这是我的处理线程。
- (void)doProcess:(id)param
{
// ...
[self performSelectorOnMainThread:@selector(askForConfirmation) withObject:nil waitUntilDone:YES];
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后在我的主线程上:
- (void)askForConfirmation
{
[[NSAlert alertWithMessageText:@"Test." defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Testing."] runModal];
}
- (IBAction)startProcessing:(id)sender
{
// ...
[NSThread detachNewThreadSelector:@selector(doProcess:) toTarget:self withObject:nil];
// ...
}
Run Code Online (Sandbox Code Playgroud) 我是一名企业C#程序员.我找到了一些时间来投资自己并陷入两难境地.从现在开始去哪儿?C#/ .NET很容易学习,开发等等.将来我想申请微软或谷歌,并希望明智地投入业余时间,所以我将学到的东西将来会蓬勃发展.
那么:C#程序员的Python或C++?我有点害怕C++,因为在其中开发任何东西都需要很长时间.Python很简单,但我认为它是一种儿童游戏语言,它仍然需要大量修补才能成为一种成熟的开发工具/语言.
任何具有相同困境的C#开发人员?
我想从解决方案资源管理器中使用WinMerge作为VS2008中的默认diff工具来代替"Compare ..."上下文菜单项.这可能吗?我正在寻找一个快速替换当前的平淡差异工具,我更喜欢WinMerge.我没有兴趣去文件夹资源管理器并在那里进行比较.
我使用Visual Source Safe 6.0而不是TFS
我有一个图像文件名,由四部分组成:
$Directory (图像所在的目录)$Name (对于一个艺术网站,这是绘画名称参考#)$File (图像文件名减去扩展名)$Extension (图片扩展名)$example 100020003000.png
Run Code Online (Sandbox Code Playgroud)
我希望相应地分解它:
$dir=1000 $name=2000 $file=3000 $ext=.png
Run Code Online (Sandbox Code Playgroud)
我想知道substr是否是分解传入的最佳选择,$example所以我可以使用4个变量来完成这些操作,例如验证/错误检查,从其$Name赋值中获取详细名称等等.我发现这篇文章:
解压缩比substr更快? 所以,在我的初学者"石头工具"的方法:
my $example = "100020003000.png";
my $dir = substr($example, 0,4);
my $name = substr($example, 5,4);
my $file = substr($example, 9,4);
my $ext = substr($example, 14,3); # will add the the "." later #
Run Code Online (Sandbox Code Playgroud)
那么,我可以使用解压缩,或者甚至是更高效的其他方法吗?
我还想避免加载任何模块,除非这样做会因为某些原因使用更少的资源.Mod是我luv'em的好工具,但我认为这里没有必要.
我意识到我应该将vars推入数组/ hash,但是,我真的是一个初学者,我需要进一步指导如何做到这一点以及如何将它们拉回来.
感谢stackoverflow.com上的所有人!
当我在20年前的大学时,C是我们选择的语言,因为当时它几乎是城里唯一的通用编程语言游戏.我们学会了使用C编程.它用于系统编程,数据结构,操作系统以及其他所有东西.基于文本的控制台I/O是与计算机交互的主要方式.图形用户界面很少见,网络编程根本不存在.
向前推进20多年.我们有很多专业的语言.例如,PHP适用于Web编程.用C编写Web应用程序会很疯狂,但同样用PHP进行系统编程也是疯狂的.
我不再写C了.可以这么说,我已经离开了这个语言的当前行业用途.我知道它用于内核开发,微控制器等.还有什么?
使用C的关键行业是什么,因为它是这项工作的最佳语言?对于哪种应用是C的首选?
以前,Google的Friend Connect要求用户将几个文件上传到他们的网站以启用跨域通信,而Facebook Connect仍然要求您上传单个文件以启用它.
现在,Friend Connect不需要任何文件上传......我想知道他们是如何实现这一目标的.
参考:http: //www.techcrunch.com/2009/10/02/easy-does-it-google-friend-connect-one-ups-facebook-connects-install-wizard/
我想将python变量名转换为等效的字符串,如图所示.有什么想法?
var = {}
print ??? # Would like to see 'var'
something_else = 3
print ??? # Would print 'something_else'
Run Code Online (Sandbox Code Playgroud) 请告诉我这段代码有什么问题:
<script type="text/javascript" >
function createimg()
{
var img = new Image();
img.src='link/to/image';
img.alt='Next image'; img.id = 'span1'; img.style.zIndex = 10;
img.style.position = 'absolute'; img.style.display='block'; img.style.top = '130px';
img.style.padding='10px'; img.style.left='440px'; img.className ='dynamicSpan';
document.body.appendChild(img);
return img;
}
function al()
{
alert('loaded');
}
a = createimg();
a.onmouseover = al();
</script>
Run Code Online (Sandbox Code Playgroud)
具体到最后一部分,我试图分配a的'onmouseover'事件处理程序,它是一个图像元素.它不会出于某种原因分配此事件处理程序,而只是在页面加载时执行该函数.
怎么了?
托尼
我有一个C#应用程序,它通过使用xsl文件转换xml文件来生成html文档.在我的xsl模板中,我引用了一个外部javascript文件,如下所示:
<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" ></script>
Run Code Online (Sandbox Code Playgroud)
在转换之后,前一行被转换为:
<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" />
Run Code Online (Sandbox Code Playgroud)
对于Firefox和Chrome,这没有问题,但是IE会抛出"找不到对象"错误并且不起作用.有任何建议让IE喜欢这种语法吗?或者我需要在xsl(或C#XslCompiledTransform类)中做些什么才能保留语法?
解决方案:通过<![CDATA[ <!-- Some Comment --> ]]>在脚本标记之间放置,解析器不会尝试缩短结束标记.