在stackoverflow上的人的帮助下,我能够获得以下简单GUI倒计时的工作代码(它只显示一个倒数秒的窗口).我对这段代码的主要问题是这些invokeLater东西.
据我所知invokeLater,它向事件调度线程(EDT)发送任务,然后EDT在"可以"(无论这意味着什么)时执行该任务.是对的吗?
根据我的理解,代码的工作原理如下:
在main我们用于invokeLater显示窗口(showGUI方法)的方法中.换句话说,显示窗口的代码将在EDT中执行.
在该main方法中,我们也启动counter并且计数器(通过构造)在另一个线程中执行(因此它不在事件调度线程中).对?
它counter在一个单独的线程中执行,并定期调用updateGUI.updateGUI应该更新GUI.GUI正在EDT中运行.所以,updateGUI也应该在EDT中执行.这就是为什么该代码的原因updateGUI被封闭在invokeLater.是对的吗?
我不清楚的是为什么我们打电话counter给EDT.无论如何,它不是在EDT中执行的.它立即启动,一个新线程并在counter那里执行.那么,为什么我们不能counter在invokeLater块之后调用main方法呢?
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class CountdownNew {
static JLabel label;
// Method which defines the appearance of the window.
public static void showGUI() {
JFrame frame = new JFrame("Simple Countdown");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
class Foo(var name: String = "bar")
Run Code Online (Sandbox Code Playgroud)
现在我尝试通过反射得到它的值和正确的类型:
val foo = new Foo
val field = foo.getClass.getDeclaredField("name")
field.setAccessible(true)
//This is where it doesn't work
val value = field.get(????)
Run Code Online (Sandbox Code Playgroud)
我尝试过像field.get(foo)这样的东西,但是它只返回一个java.lang.Object但没有String.基本上我需要正确的类型,因为我想在它上面调用一个方法(例如toCharArray).
建议的方法是什么?
嗨,我看到以下代码:
void UpdateMessage (string message)
{
Action action = () => txtMessage.Text = message;
this.Invoke (action);
}
Run Code Online (Sandbox Code Playgroud)
为什么使用Action然后在这里调用动作?为什么不只是txtMessage.Text = message用来替换函数体中的代码?
更新
在评论中提供的更完整版本的代码,下面再现了语法高亮,缩进等.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Thread(Work).Start();
}
void Work()
{
Thread.Sleep(5000);
UpdateMessage("My Garden");
}
void UpdateMessage(string message) {
Action action = () => textBox1.Text = message;
this.Invoke(action);
}
}
Run Code Online (Sandbox Code Playgroud) 在运行时,我正在获取类的方法名列表,我想调用这些方法.我理解如何从这里完成第一部分:http: //docs.codehaus.org/display/GROOVY/JN3535-Reflection
GroovyObject.methods.each{ println it.name }
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到的信息是如何在我抓住它的名字后再调用一个方法.
我想要的是到达这里:
GroovyObject.methods.each{ GroovyObject.invokeMethod( it.name, argList) }
Run Code Online (Sandbox Code Playgroud)
我似乎找不到正确的语法.上面似乎假设我已经重载了GroovyObject类的默认invokeMethod,这不是我想要的方向.
我目前正在使用用Java实现的专门的,解释性的编程语言.作为该语言的一小部分,我想添加调用Java的能力.在深入研究反射的所有细节之前,我想知道是否有人知道一个通用库来执行反向调用Java代码的"后端"部分.
也就是说,我将一个字符串(我定义语法)解析为一些表示Java方法调用(或构造函数或字段访问)的数据结构,然后将该数据结构传递给调用该调用并返回结果的库.特别是,我希望它已经处理了我不想弄清楚的所有边缘情况:
我花了一点时间在JVM上查看动态语言的实现,但这些通常比我正在寻找的要复杂得多,或者针对特定语言进行了高度优化.
另一个选择是将我的语法转换为某种动态语言的字符串,并使用Rhino或其他东西调用它,但这比我正在寻找的开销稍微多一些.
谢谢!
我目前正在尝试编写一个组件,其中某些部分应该在UI线程上运行(解释会很长).所以最简单的方法是将控件传递给它,并在其上使用InvokeRequired/Invoke.但我不认为将控件引用传递给"数据/背景"组件是一个好设计,所以我正在寻找一种在UI线程上运行代码的方法,而无需提供控件.像WPF中的Application.Dispatcher.Invoke ...
任何想法,马丁
我使用下面的代码访问我的表单上的属性,但今天我想把东西写入ListView,这需要更多的参数.
public string TextValue
{
set
{
if (this.Memo.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
this.Memo.Text += value + "\n";
});
}
else
{
this.Memo.Text += value + "\n";
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何添加多个参数以及如何使用它们(值,值)?
当我从工作线程调用UI线程时,我遇到了死锁.实际上,工作线程在调用行上被阻塞:
return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });
Run Code Online (Sandbox Code Playgroud)
奇怪的是UI线程(如果我错了,纠正我,是主线程)是空闲的.
有没有办法:
我们可以在下图中看到,Invoke行上阻塞的工作线程(ID 3732),以及MainThread在应用程序的main函数中处于空闲状态.

编辑:这是主线程的堆栈:

编辑2:实际上,我第二次暂停了程序,这就是堆栈的样子:

编辑3:找到解决方法
我终于找到了解决方法.问题显然是由于异步包装器竞争条件问题.解决方法是使用BeginInvoke并等待超时.当它超时时,再次调用它并循环直到它最终返回.大多数情况下,它实际上适用于第二次调用.
IAsyncResult ar = mInterfaceTraitement.BeginInvoke(d, new object[] { psFamille });
while (!ar.AsyncWaitHandle.WaitOne(3000, false))
{
ar = mInterfaceTraitement.BeginInvoke(d, new object[] { psFamille });
}
// Async call has returned - get response
ucAvancementTrtFamille mucAvancementTrtFamille = (ucAvancementTrtFamille)mInterfaceTraitement.EndInvoke(ar);
Run Code Online (Sandbox Code Playgroud)
它并不漂亮,但它是我找到的唯一解决方案.
什么是方法调用,control.invoke?
在编程中一般调用什么
例子 :
MethodInvoker getValues = new MethodInvoker(delegate()
{
checkbox1Checked = checkbox1.Checked;
textBox6Text = textBox6.Text;
textBox7Text = textBox7.Text;
textBox3Text = textBox3.Text;
textBox1Text = textBox1.Text;
textBox4Text = textBox4.Text;
richTextBox1Text = richTextBox1.Text;
textBox5Text = textBox5.Text;
});
if (this.InvokeRequired)
{
this.Invoke(getValues);
}
else
{
getValues();
}
Run Code Online (Sandbox Code Playgroud)
而且我也想知道MethodInvoker和InvokeRequired是什么意思?
假设我可以构造一个匹配现有类的字符串,我该如何调用它?
例如,我有几个类:
我想通过构造一个匹配其名称的字符串来动态调用它们.如果他们都有方法"方法",我该如何做这样的事情?:
(1..3).each do |n|
("MyClass"+n).methods
end
Run Code Online (Sandbox Code Playgroud)