Redian新闻
>
有人听说过DesignWorks画电路吗?
avatar
有人听说过DesignWorks画电路吗?# EE - 电子工程
n*m
1
木秀于林,风必摧之?
avatar
o*2
2
最近正在写一个learn fast messenger programming by example的tutorial。计划有
以下这几篇,前三篇已经完成了,在http://fastmessenger.com/knowledgebase/
已完成:
Example 1: Create a FMP program from refactoring
Example 2: Create a FMP program from scratch
Example 3: Implement active objects
快完成:
Example 4: An active object is a single headcount
Example 5: An active object could be a group headcount
Example 6: Active objects in GUI programs
(注1:single headcount概念用来说明一个active object在处理能力上相当于一个单
人。)
(注2:group headcount概念用来说明一个active object在处理能力上相当于一个多
人组成的group。)
(注3:headcount是一个measurable unit of capacity of concurrence。)
(注4:example 6 展示messenger在幕后给特定active object分配特定thread的能力
。)
avatar
N*g
3
这是什么软件? 新到的公司用这个画电路, 这软件有什么功能? 几秒钟就装完了。
avatar
s*r
4
木秀于林? 芙蓉般的自信呀
avatar
n*t
5
说实话,你这么搞有什么好处么?

【在 o**2 的大作中提到】
: 最近正在写一个learn fast messenger programming by example的tutorial。计划有
: 以下这几篇,前三篇已经完成了,在http://fastmessenger.com/knowledgebase/
: 已完成:
: Example 1: Create a FMP program from refactoring
: Example 2: Create a FMP program from scratch
: Example 3: Implement active objects
: 快完成:
: Example 4: An active object is a single headcount
: Example 5: An active object could be a group headcount
: Example 6: Active objects in GUI programs

avatar
kn
6
画schematic电路图的。可以做simulation啥的。
我老板给本科生freshmen开的intro to computer engineering课,用这软件做project

【在 N*******g 的大作中提到】
: 这是什么软件? 新到的公司用这个画电路, 这软件有什么功能? 几秒钟就装完了。
avatar
d*n
7
why?

【在 n*****m 的大作中提到】
: 木秀于林,风必摧之?
avatar
b*s
8
非要有好处吗

【在 n******t 的大作中提到】
: 说实话,你这么搞有什么好处么?
avatar
o*2
9
你问的是:在这里推广FMP的好处?还是使用FMP的好处?

【在 n******t 的大作中提到】
: 说实话,你这么搞有什么好处么?
avatar
t*t
10
不知道netghost, 但是我是来问使用FMP的好处的, 前面你说了一堆, 我没看到什么好
处呀.

【在 o**2 的大作中提到】
: 你问的是:在这里推广FMP的好处?还是使用FMP的好处?
avatar
o*2
11
首要的好处是写并发程序更简单、更不容易出错了,因为FMP用active object取代了
thread。(当然不是一对一的简单替代。)
如果你对这个context有了解、并目前需要用多线程的话,我才好更有针对性的介绍FMP
的好处。(这个tutorial只是介绍FMP本身,供人查询和了解细节用的,并没有涉及到
对比和总结好处。)
这个前提是我经过无数挫折总结出来的,我的最终结论就是我只能面对面地对别人介绍
使用FMP的好处,因为要花很多时间把人带到特定的并发编程领域,然后才能涉及更细
节的东西。
你经常用多线程编程吗?

【在 t****t 的大作中提到】
: 不知道netghost, 但是我是来问使用FMP的好处的, 前面你说了一堆, 我没看到什么好
: 处呀.

avatar
b*i
12
比如,按下一个按钮要打开文件,能用你这个多线程读入文件吗?给个具体例子吧。
程序就叫FMPTest,extends JFrame,里面有一个JLabel,一个JButton, 要求点击
JButton打开FileDialog,选好文本文件后,用FMP线程读入,然后在JLabel里面显示
Good出现的次数。要求不能在UI线程里面读入文件。

FMP

【在 o**2 的大作中提到】
: 首要的好处是写并发程序更简单、更不容易出错了,因为FMP用active object取代了
: thread。(当然不是一对一的简单替代。)
: 如果你对这个context有了解、并目前需要用多线程的话,我才好更有针对性的介绍FMP
: 的好处。(这个tutorial只是介绍FMP本身,供人查询和了解细节用的,并没有涉及到
: 对比和总结好处。)
: 这个前提是我经过无数挫折总结出来的,我的最终结论就是我只能面对面地对别人介绍
: 使用FMP的好处,因为要花很多时间把人带到特定的并发编程领域,然后才能涉及更细
: 节的东西。
: 你经常用多线程编程吗?

avatar
o*2
13
你说的基本上是 example 6 的内容,我今天可以抽时间先给你写一个源程序。请稍候
数小时。
其实我之前已经写过一个类似的GUI程序了:
http://www.mitbbs.com/article_t0/Programming/31254349.html
FMP 支持 JavaFX, Swing and SWT 中的 UI thread

【在 b***i 的大作中提到】
: 比如,按下一个按钮要打开文件,能用你这个多线程读入文件吗?给个具体例子吧。
: 程序就叫FMPTest,extends JFrame,里面有一个JLabel,一个JButton, 要求点击
: JButton打开FileDialog,选好文本文件后,用FMP线程读入,然后在JLabel里面显示
: Good出现的次数。要求不能在UI线程里面读入文件。
:
: FMP

avatar
t*t
14
我用多线程, 不过我觉得这不是很重要. 从前面的介绍来看, 很多人问, 但是你没有回
答的问题是: FMP和现有的future相比, 有什么好处? 从我自己的理解来看, 没有什么
明显的好处, 所以请你进一步介绍一下, 理论或者实例都可以.

FMP

【在 o**2 的大作中提到】
: 首要的好处是写并发程序更简单、更不容易出错了,因为FMP用active object取代了
: thread。(当然不是一对一的简单替代。)
: 如果你对这个context有了解、并目前需要用多线程的话,我才好更有针对性的介绍FMP
: 的好处。(这个tutorial只是介绍FMP本身,供人查询和了解细节用的,并没有涉及到
: 对比和总结好处。)
: 这个前提是我经过无数挫折总结出来的,我的最终结论就是我只能面对面地对别人介绍
: 使用FMP的好处,因为要花很多时间把人带到特定的并发编程领域,然后才能涉及更细
: 节的东西。
: 你经常用多线程编程吗?

avatar
b*i
15
你有完整代码吗?假定多线程打开文件搜索的结果就是555,你写个完整的程序让咱看看
到底好在哪里

【在 o**2 的大作中提到】
: 你说的基本上是 example 6 的内容,我今天可以抽时间先给你写一个源程序。请稍候
: 数小时。
: 其实我之前已经写过一个类似的GUI程序了:
: http://www.mitbbs.com/article_t0/Programming/31254349.html
: FMP 支持 JavaFX, Swing and SWT 中的 UI thread

avatar
o*2
16

这里是完整的可运行的代码。需要的FMP库在: http://search.maven.org/#browse|1968728870
import com.fastmessenger.impl.GuiMessenger;
public class Main {
public static void main (String[] args) {
GuiMessenger messenger = new GuiMessenger ();
FMPTest win = new FMPTest (messenger);
FileAnalyzer analyzer = new FileAnalyzer (messenger);
messenger.registerSwingReceiver (win, "main.frame", "setStatus");
messenger.registerReceiver (analyzer, "file.analyzer", "countWord");
win.pack ();
win.setVisible (true);
}
}
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.*;
import com.fastmessenger.impl.GuiMessenger;
public class FMPTest extends JFrame {
private GuiMessenger messenger;
private JLabel statusLabel;
private JButton fileButton;
public FMPTest (GuiMessenger messenger) {
super ("Test FMP in GUI");
setDefaultCloseOperation (EXIT_ON_CLOSE);
this.messenger = messenger;
statusLabel = new JLabel ("init");
fileButton = new JButton ("Select a file");
fileButton.addActionListener (new ActionListener () {
public void actionPerformed (ActionEvent e) {
JFileChooser fc = new JFileChooser ();
int returnVal = fc.showOpenDialog (FMPTest.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile ();
FMPTest.this.messenger.sendMessage ("file.analyzer:
countWord", file, "Good");
}
}
});
getContentPane ().add (statusLabel, BorderLayout.NORTH);
getContentPane ().add (fileButton, BorderLayout.SOUTH);
}
public void setStatus (String status) {
System.out.println ("setStatus() in the thread: " + Thread.
currentThread ().getName ());
statusLabel.setText (status);
}
}
import java.io.File;
import com.fastmessenger.impl.GuiMessenger;
public class FileAnalyzer {
private GuiMessenger messenger;
public FileAnalyzer (GuiMessenger messenger) {
this.messenger = messenger;
}
public void countWord (File file, String word) {
System.out.println ("countWord() in the thread: " + Thread.
currentThread ().getName ());
// read file and process the contents in the file
String status = "Search word '" + word + "' in the " + file.
getAbsolutePath ();
messenger.sendMessage ("main.frame:setStatus", status);
}
}

【在 b***i 的大作中提到】
: 你有完整代码吗?假定多线程打开文件搜索的结果就是555,你写个完整的程序让咱看看
: 到底好在哪里

avatar
o*2
17
从被调用的object的角度来看,messenger.sendMessage ()和 messenger.callService
()是一样的。
从调用者的角度来看,messenger.callService ()会返回一个IReturn,也就是Future
,通过它调用者可以得到被调用的object的return value。
avatar
o*2
18
把FMP收窄到和future相比,那就很好回答了。我准备一下,今晚或明天答复你。

【在 t****t 的大作中提到】
: 我用多线程, 不过我觉得这不是很重要. 从前面的介绍来看, 很多人问, 但是你没有回
: 答的问题是: FMP和现有的future相比, 有什么好处? 从我自己的理解来看, 没有什么
: 明显的好处, 所以请你进一步介绍一下, 理论或者实例都可以.
:
: FMP

avatar
t*t
19
这种事情还要准备的...答辩?

【在 o**2 的大作中提到】
: 把FMP收窄到和future相比,那就很好回答了。我准备一下,今晚或明天答复你。
avatar
o*2
20
作为一个open source project,FMP出来混总是要面对各种疑问的,我好好总结一下,
这个主题可以作为一个FAQ的条目。
欢迎多问问题 :)

【在 t****t 的大作中提到】
: 这种事情还要准备的...答辩?
avatar
b*i
21
用了一下,看起来不错。是挺方便的。

);

【在 o**2 的大作中提到】
: 作为一个open source project,FMP出来混总是要面对各种疑问的,我好好总结一下,
: 这个主题可以作为一个FAQ的条目。
: 欢迎多问问题 :)

avatar
o*2
22
多谢肯定。已加了你的linkedin。你要是有GitHub帐号的话,欢迎关注https://github
.com/fastmessenger

【在 b***i 的大作中提到】
: 用了一下,看起来不错。是挺方便的。
:
: );

avatar
o*2
23
突然想起我以前有一篇blog从抽象的角度比较thread,thread pool,和FMP。结论是
FMP比thread pool(future是该model的一个成员)还要高级,就象C比汇编高级的那种
高级。
[obsolete] Fast Messenger: a high-level concurrent programming model
https://weblogs.java.net/blog/rexyoung/archive/2012/09/11/obsolete-fast-
messenger-high-level-concurrent-programming-model
请你看完之后告诉我一声,看看我算不算交差了。当然,欢迎接着提问!

【在 t****t 的大作中提到】
: 我用多线程, 不过我觉得这不是很重要. 从前面的介绍来看, 很多人问, 但是你没有回
: 答的问题是: FMP和现有的future相比, 有什么好处? 从我自己的理解来看, 没有什么
: 明显的好处, 所以请你进一步介绍一下, 理论或者实例都可以.
:
: FMP

avatar
o*2
25
把你的問題搬到這裏來了,等inputking活過來了再聊。

何做呢?

【在 b***i 的大作中提到】
: 用了一下,看起来不错。是挺方便的。
:
: );

avatar
o*2
26

何做呢?
FMP本身不提供强制中断的机制,这和FMP的model有关,model里的每个active object
都是平等的,你只能发message发request给一个active object,但不能干涉它如何处
理它的message。
所以干涉或中断的责任就由用户承担了。比如之前的FileAnalyzer要实现“中断查找”
就要能接受两种message。一是开始,二是终止。然后在查找的过程中要时不时的暂停
,看看有没有终止message进来。这个暂停的效果,目前也是由用户用message来实现的。
下面是改写后的FileAnalyzer。
public class FileAnalyzer {
private GuiMessenger messenger;
private boolean working;
public FileAnalyzer (GuiMessenger messenger) {
this.messenger = messenger;
}
public void countWord (File file, String word) {
working = true;
messenger.sendMessage ("file.analyzer:resumeCounting", file, word, 0
, 0);
}
public void stopCounting () {
working = false;
}
public void resumeCounting (File file, String word, long pos, int count)
{
if (!working) {
return;
}
boolean finishedEntireFile = false;
// A small piece of work:
// 1, open file
// 2, read XXX more bytes/lines from position at
// 3, update , , and
// 4, close file
if (finishedEntireFile) {
stopCounting ();
messenger.sendMessage ("main.frame:setStatus", "xxxx");
} else {
messenger.sendMessage ("file.analyzer:resumeCounting", file,
word, pos, count);
}
}
}

【在 b***i 的大作中提到】
: 用了一下,看起来不错。是挺方便的。
:
: );

avatar
o*2
27
Main class 也要相应地加上:
messenger.registerReceiver (analyzer, "file.analyzer", "countWord", "
stopCounting", "resumeCounting");
avatar
c*n
28
大概看了一下。 问几个问题。 (不是来挑刺的)。
1) FMP 和 Qt/Glib 的 Signal framework 有什么本质不同吗? 好像都是 work
submission。 在submit work/task/ 的时候, caller 提供 target object, target
method, target arguments. 最后work给提供到一个eventloop里。 在 FMP里,
Messenger有eventloop 吧。
2) 对没有Runtime Type Information 的语言, 如C, C++, FMP 可用吗?Glib/C
implement了复杂的 Type System, Qt/C++ 提供了MOC compiler 来解决 C/C++ 的 RTI
问题。
avatar
o*2
29
有本质的不同,体现在FMP比task更进了一步。首先,FMP把这些task集中起来放在一个
active object里了;然后再对这个active object抽象了一次,把它完全变成了一个
object的spec;最后,由其它一个(甚至多个)solid的impl object来实现这个spec。
(see figure below)
FMP里的messenger object是整个体系的关键,不同的messenger implementations只要
能维持active object的spec和语义一致不变,那user programs就完全不受影响了。于
是messenger object在内部怎么搞都可以了,比如:可以用一个impl object;可以用
多个impl objects来支持一个active object;甚至可以用非object,比如C,来实现这
个active object;再比如可以自由安排内部的thread等。
FMP对message的data type没有定义,完全留给实现者根据具体的语言决定其特定的风
格。这也导致了FMP不能实现在编译时做静态类型检查。

submission。 在submit work/task/ 的时候, caller 提供 target object, target
method, target arguments. 最后work给提供到一个eventloop里。 在 FMP里,
Messenger有eventloop 吧。
implement了复杂的 Type System, Qt/C++ 提供了MOC compiler 来解决 C/C++ 的 RTI
问题。

【在 c*****n 的大作中提到】
: 大概看了一下。 问几个问题。 (不是来挑刺的)。
: 1) FMP 和 Qt/Glib 的 Signal framework 有什么本质不同吗? 好像都是 work
: submission。 在submit work/task/ 的时候, caller 提供 target object, target
: method, target arguments. 最后work给提供到一个eventloop里。 在 FMP里,
: Messenger有eventloop 吧。
: 2) 对没有Runtime Type Information 的语言, 如C, C++, FMP 可用吗?Glib/C
: implement了复杂的 Type System, Qt/C++ 提供了MOC compiler 来解决 C/C++ 的 RTI
: 问题。

avatar
c*n
30
还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
messenger里面。
比如,
在例5中,fileButton.setOnAction(),
1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主
要优势?application在通常情况下要自行定义messenger吗?
avatar
o*2
31
我之前给你的回复,是基于Java中标准的task,因为你把它归类到task,我就当成是一
回事了。
我对Qt并不了解,刚才看了一下Qt的文档(http://qt-project.org/doc/qt-4.8/signalsandslots.html)。觉得在GUI的单线程环境下,你说得对,Qt的确和FMP有很大的相似性。
我今晚找个时间仔细看一下Qt的文档,再和你继续讨论。

【在 c*****n 的大作中提到】
: 还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
: performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
: messenger里面。
: 比如,
: 在例5中,fileButton.setOnAction(),
: 1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
: 2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
: 3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
: 可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
: 是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主

avatar
o*2
32
http://qt-project.org/doc/qt-4.8/signalsandslots.html
看了上面Qt Signals & Slots的文档,发现它和FMP不但本质不同,连表面都不同。我
这里就在Qt能做的事的范围内挑几条来简单比较一下,FMP能做而Qt不能做的就不提了。
1,被调用的class and methods
Qt:Slot functions除了和signals配合用之外,也可以当普通function来用。但是在
source里必须subclass QObject,并写上“public slots:”。
FMP:source里不需要任何特殊处理,只要注册的时候申明,如:guiMessenger.
registerJavaFxReceiver (this, "file.frame", "setStatus")。
FMP也可以使用marker interface IReceiver来写class and methods:
public class Calculator implements IReceiver {
public Object onPortRequest (String port, Object... args) {
}
}
2,调用者
Qt:当成对用slot的时候,caller必须是signal function。
FMP:只要有messenger的reference,任何地方的代码都可以调用active object。
3,同步/异步
Qt:有时同步,有时异步,从source上看不出来。
FMP:总是异步,但可以用两行来同步:1,IReturn defer =callServer();2,defer.
get()。非常方便,source code读起来没有歧义。
4,寻址
Qt:只能用connect来间接寻址。
FMP:可以直接,可以间接,比如:publishMessage(source,target)

【在 c*****n 的大作中提到】
: 还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
: performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
: messenger里面。
: 比如,
: 在例5中,fileButton.setOnAction(),
: 1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
: 2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
: 3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
: 可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
: 是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主

avatar
o*2
33
如果一定要用上eventloop这个概念的话,应该是每一个active object有一个自己的
eventloop。
你提到的例5里面,只有一个messenger instance,就是在125行处的new GuiMessenger
()。然后这个instance被传到了FileAnalyzer里去。
GuiMessenger可以精确的使用特定的thread执行一个特定的active object。
Active object "file.frame"是在127行用guiMessenger.registerJavaFxReceiver (
this, "file.frame", "setStatus");来注册的,所以guiMessenger在内部会用JavaFX
的thread来执行"file.frame"。
而active object "file.analyzer"是在130行注册的普通active object,
guiMessenger将用ThreadPool里的thread来执行"file.analyzer"。
但对使用的user program来说,调用它们是没有区别的。

【在 c*****n 的大作中提到】
: 还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
: performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
: messenger里面。
: 比如,
: 在例5中,fileButton.setOnAction(),
: 1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
: 2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
: 3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
: 可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
: 是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。