标签: invoke

事件派发线程如何工作?

stackoverflow上的人的帮助下,我能够获得以下简单GUI倒计时的工作代码(它只显示一个倒数秒的窗口).我对这段代码的主要问题是这些invokeLater东西.

据我所知invokeLater,它向事件调度线程(EDT)发送任务,然后EDT在"可以"(无论这意味着什么)时执行该任务.是对的吗?

根据我的理解,代码的工作原理如下:

  1. main我们用于invokeLater显示窗口(showGUI方法)的方法中.换句话说,显示窗口的代码将在EDT中执行.

  2. 在该main方法中,我们也启动counter并且计数器(通过构造)在另一个线程中执行(因此它不在事件调度线程中).对?

  3. counter在一个单独的线程中执行,并定期调用updateGUI.updateGUI应该更新GUI.GUI正在EDT中运行.所以,updateGUI也应该在EDT中执行.这就是为什么该代码的原因updateGUI被封闭在invokeLater.是对的吗?

我不清楚的是为什么我们打电话counter给EDT.无论如何,它不是在EDT中执行的.它立即启动,一个新线程并在counter那里执行.那么,为什么我们不能counterinvokeLater块之后调用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)

java events user-interface multithreading invoke

12
推荐指数
1
解决办法
1万
查看次数

如何通过反射访问字段的值(Scala 2.8)

请考虑以下代码:

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).

建议的方法是什么?

reflection scala field invoke scala-2.8

12
推荐指数
2
解决办法
1万
查看次数

为什么在此代码中使用Action?

嗨,我看到以下代码:

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)

c# multithreading action invoke

12
推荐指数
2
解决办法
338
查看次数

如何在Groovy中动态调用方法?

在运行时,我正在获取类的方法名列表,我想调用这些方法.我理解如何从这里完成第一部分: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,这不是我想要的方向.

groovy invoke dynamicmethod

12
推荐指数
2
解决办法
2万
查看次数

是否有一个用于Java反射的通用"后端"库

我目前正在使用用Java实现的专门的,解释性的编程语言.作为该语言的一小部分,我想添加调用Java的能力.在深入研究反射的所有细节之前,我想知道是否有人知道一个通​​用库来执行反向调用Java代码的"后端"部分.

也就是说,我将一个字符串(我定义语法)解析为一些表示Java方法调用(或构造函数或字段访问)的数据结构,然后将该数据结构传递给调用该调用并返回结果的库.特别是,我希望它已经处理了我不想弄清楚的所有边缘情况:

  • 根据参数类型自动选择正确的方法(如智能Class.getDeclaredMethod())
  • 处理数组和普通对象引用之间的区别
  • 等等

我花了一点时间在JVM上查看动态语言的实现,但这些通常比我正在寻找的要复杂得多,或者针对特定语言进行了高度优化.

另一个选择是将我的语法转换为某种动态语言的字符串,并使用Rhino或其他东西调用它,但这比我正在寻找的开销稍微多一些.

谢谢!

java reflection dynamic invoke

11
推荐指数
3
解决办法
4575
查看次数

在没有控制对象存在的UI线程上运行代码

我目前正在尝试编写一个组件,其中某些部分应该在UI线程上运行(解释会很长).所以最简单的方法是将控件传递给它,并在其上使用InvokeRequired/Invoke.但我不认为将控件引用传递给"数据/背景"组件是一个好设计,所以我正在寻找一种在UI线程上运行代码的方法,而无需提供控件.像WPF中的Application.Dispatcher.Invoke ...

任何想法,马丁

invoke ui-thread invokerequired winforms

11
推荐指数
2
解决办法
5594
查看次数

C#如何使用多个参数调用

我使用下面的代码访问我的表单上的属性,但今天我想把东西写入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)

如何添加多个参数以及如何使用它们(值,值)?

c# invoke winforms

11
推荐指数
1
解决办法
2万
查看次数

从工作线程调用UI线程时出现死锁

当我从工作线程调用UI线程时,我遇到了死锁.实际上,工作线程在调用行上被阻塞:

return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });
Run Code Online (Sandbox Code Playgroud)

奇怪的是UI线程(如果我错了,纠正我,是主线程)是空闲的.

有没有办法:

  1. 看看我实际上想要调用哪个线程?
  2. 看看线程到底在做什么?

我们可以在下图中看到,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)

它并不漂亮,但它是我找到的唯一解决方案.

.net c# multithreading deadlock invoke

11
推荐指数
1
解决办法
4728
查看次数

什么是调用?

什么是方法调用,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是什么意思?

c# invoke visual-studio

11
推荐指数
1
解决办法
2万
查看次数

如何在Rails中动态调用或调用类?

假设我可以构造一个匹配现有类的字符串,我该如何调用它?

例如,我有几个类:

  • MyClass1的
  • MyClass2
  • MyClass3

我想通过构造一个匹配其名称的字符串来动态调用它们.如果他们都有方法"方法",我该如何做这样的事情?:

(1..3).each do |n|
  ("MyClass"+n).methods
end
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails class dynamic invoke

11
推荐指数
1
解决办法
5410
查看次数