我接受了MUG4N对这个问题的回答,我也想回应一些针对它提出的批评.
克里斯夫说:
...您无法直接从后台线程进行UI调用.
这是一个一揽子声明,并非100%正确.我只想指出一些事实:
实际上,你可以使UI呼吁所有你想要的,如果你设置Control.CheckForIllegalCrossThreadCalls = false."确认!" 我听你说."不要永远做!" 是的,是的 - 但为什么呢?答案:因为有时这会破坏记忆.
中的控件类System.Windows.Forms不是编写为线程安全的,因此有时从后台线程更新它们可能会破坏内存.但是,如果这种情况有时只发生而且并非总是如此,那么这告诉我的不是UI代码本身的调用,而是可能导致异常的UI代码的潜在不安全冲突.
为了强调第1点,请考虑以下事项:从后台线程调用UI代码的"安全"方法是使用Control.Invokeor Control.BeginInvoke,对吗?但这是一个UI调用 ; 如果我们从非GUI线程更新GUI,那只是我们应该进行的 UI调用.我的意思是,显然,它不是简单地Control从外部线程调用对象的"任何"方法,这将导致混乱(如果是这种情况,那么我们甚至无法调用Invoke,我们将被完全卡住) .同样,它是单独的UI调用的潜在冲突,它们不能同时安全地发生,这将证明具有破坏性.
牢记以上两点,请问自己:为什么MessageBox.Show从非GUI线程调用会不安全?Form创建并显示完全独立的内容; 它的属性不以任何方式与任何其他现有GUI对象交互; 事实上,它不能以任何方式在任何地方访问,除了一个:来自调用线程,它访问其属性(并且只通过方法的返回值).DialogResultShow
继续前进.康拉德·阿尔布雷希特说:
...鉴于断言Show()在Dan的ref'd主题中设置了自己的消息泵,(这没有证实,但我不能反驳)......
这是一个完全公平的观点(尽管我个人非常尊重贾里德帕尔,我通常不会怀疑他说的是什么).无论如何,MessageBox.Show通过Reflector查看方法会显示以下片段:
Application.BeginModalMessageLoop();
try
{
result …Run Code Online (Sandbox Code Playgroud) 我想创建一个类似于Qt Creator主要布局的GUI,因此我正在寻找Qt Creator源文件.
任何人都可以指示我从哪里下载.
我希望能够做到以下几点:
我有一个包含数据类型的字符串数组:
string DataTypeValues[20] = {"char", "unsigned char", "short", "int"};
Run Code Online (Sandbox Code Playgroud)
然后,我想在运行时创建一个数据类型的变量.我不会在编译时知道正确的数据类型应该是什么.
因此,例如,如果在运行时我确定变量x需要是int类型:
DataTypeValues[3] x = 100;
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,所以我怎么能这样做呢?
我在构造一个返回XML样式层次结构的查询时遇到了极大的困难.
我们有一个数据库表,其中包含我们网站的URL层次结构.该表包含列:ID,URL,DisplayName,ParentID,ItemOrder
父ID在当前项和它的父项之间形成递归关系.该项目应位于层次结构中它的父级下方,并且还应使用项目顺序对层次结构中同一级别的项目进行排序.
我设法得到一个递归查询工作,所以它按顺序向下钻取层次结构,但我也不能按项目顺序排序.
我目前的查询如下:
WITH Parents AS
(
SELECT MenuItemId, URL, ParentItemId, ItemOrder
FROM CambsMenu
UNION ALL
SELECT si.MenuItemId, si.URL, si.ParentItemId, si.ItemOrder
FROM CambsMenu si INNER JOIN Parents p
ON si.ParentItemId = p.MenuItemId
)
SELECT DISTINCT *
FROM Parents
Run Code Online (Sandbox Code Playgroud) 我正在尝试重新创建照片应用程序的行为,您可以在其中同时平移,捏合和旋转.我有基本的工作,但我坚持一些东西.
对于平移,我通过平移量来偏移视图的中心点.这很好用.
对于捏和旋转,我正在对视图应用仿射变换.这也很好.
问题是当我平移(即移动子视图),然后捏合或旋转时 - 仿射变换似乎使用视图的旧中心点应用.我虽然它应该使用当前的中心点作为转换起源 - 因为我正在更新中心点,当我平移我虽然这应该工作.我没有围绕子视图的中心点旋转,而是围绕原始中心点进行旋转运动.
我该如何纠正?显然可以直观地组合这三个手势,因为照片应用程序成功地完成了它.
我尝试使用平移的仿射翻译,但效果是一样的.
我知道CookieManager的存在,但是如何仅删除域的cookie?
有人可以帮我一些代码片段吗?
我如何在Ctrl + Shift + E上执行某些命令?如我所见,我们可以编写以下内容:
KeyBinding kb = new KeyBinding(TestCommand, Key.E, ModifierKeys.Control);
this.InputBindings.Add(kb);
Run Code Online (Sandbox Code Playgroud)
但是如何添加更多的ModifierKeys或Keys?
我有一个二维数组,
string[,] table = {
{ "aa", "aaa" },
{ "bb", "bbb" }
};
Run Code Online (Sandbox Code Playgroud)
我想像这样foreach通过它,
foreach (string[] row in table)
{
Console.WriteLine(row[0] + " " + row[1]);
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到错误:
无法将类型字符串转换为字符串[]
有没有办法可以达到我想要的效果,即用迭代器变量迭代数组的第一维,然后返回该行的一维数组?
对于一个小项目(问题10项目欧拉),我试图总结低于2百万的所有素数.所以我使用了暴力方法并从0到2'000'000迭代并检查数字是否为素数.如果是,我将它添加到总和中:
private int sum = 0;
private void calculate() {
for (int i = 0; i < 2000000; i++) {
if (i.isPrime()) {
sum = sum + i;
}
}
sysout(sum)
}
Run Code Online (Sandbox Code Playgroud)
此计算的结果是1179908154,但这是不正确的.所以我将int更改为BigInteger,现在我得到了正确的总和142913828922.显然int的范围溢出了.但是为什么Java不能告诉我那个?(例如,例外)