大浪淘沙 给我一片天空。。。。
▓   .   *  __       *       ☆
   ./  \~~~▓~~~~\| ◆         .
   / # \ ══════\.◆      *  *
 ..▎[] ▎ 田  田▎ | ┃◆   .
   ▎   ▎          ▎'| '▎ @       .
   ■■■■■■■■■■〓▄▃▂▁
船长 @ 2009-03-26 10:00

在终端cd到netbeans下载放置的目录,输入./netbeans-6.1-javaee-linux.sh,出现了找不到jdk错误信息:

 

Configuring installer...

Search JVM on the system...

Java SE Development Kit (JDK) was not found on this computer

JDK 6 or JDK 5 is required for installing the NetBeans IDE. Make sure that the JDK is properly installed and run installer again.

You can specify valid JDK location using --javahome installer argument.

 

To download the JDK, visit http//java.sun.com/javase/downloads

 

在Ubuntu下已经安装了JDK5和JDK6,怎么会一个都找不到,难道是两者同时安装了对netbeans有冲突,使得netbeans一个都找不到,或不知道使用哪一个jdk。

 

幸好提示信息里有个使用 --javahome 安装参数指定JDK安装位置

 

接着在终端输入 ./netbeans-6.1-javaee-linux.sh --javahome /usr/lib/j2sdk1.6-sun

 

Configuring installer...

Search JVM on the system...

Extracting installation data...

Running installer wizard...

 

安装向导窗口正常跳出。



 
船长 @ 2009-03-26 09:59

l 使用gtk_idle_add实现异步signal。
最近开发桌面模块时,遇到一个棘手的问题:向DirectFB 的窗口管理器注册了顶层窗口改变的事件。当前顶层窗口切换时,窗口管理器回调我设置的回调函数,在回调函数中又要调用窗口管理器的函数,以获取顶层窗口的 信息。整个过程是同步调用的,即直接调用函数,这会重入一个窗口管理器函数,造成死锁。
后来通过gtk_idle_add把同步操作转换成异 步操作,解决了这个问题。在Window上, SendMessage和PostMessage分别对应于同步和异步消息。而在GTK+中,它所有的signal都是同步,要实现异步的signal, 最简单的办法就使用gtk_idle_add。
l 使用gtk_quit_add释放资源。
在开发桌面模块时, 遇到另外一个问题:在注销时,退出桌面,这时要释放一些资源,包括关闭一些GtkWidget。这些操作是在退出gtk主循环后处理的,关闭 GtkWidget时,总是会会死掉。看样子,在此之前,GtkWidget已经被非正常关闭了。所谓非正常,是说资源被销毁了,但destroy函数并 没有被调用。
后来发现,在退出主循环时,所有的GUI资源都被释放掉了,DirectFB已经销毁,之后再访问GUI资源,后果无法预料。这 样的操作只能在主循环之退出前调用,要做到这一点,可以通过gtk_quit_add增加了一个释放函数,在退出主循环之前被自动调用。一切OK了。
l 调试用libtool生成的可执行文件。
用libtool产生的可执行文件,分为两层,外层是一个脚本文件,内层才是ELF文件。ELF文件放在.lib目录中,在linux下,以.开头的文 件都是隐藏的,所以正常情况下看不到。一般都通过脚本文件运行,脚本文件会处理共享库相关的一些设置,比如设置库的路径等等。
不知道内幕的新手,往往尝试用gdb去调试脚本文件,面对莫名其妙的错误束手无策。即使知道.lib下的文件才是真正的可执行文件,去调试那个ELF文件仍然很麻烦,你必须要手工去设置库的路径。
其实不用那么麻烦,脚本文件最终不是要执行真正的ELF文件吗?用vim打开那个文件,我们发现它调用exec去执行真正的ELF文件,把exec换成 gdb,然后再运行这个脚本文件,不用其它任何设置,自动进入调试器。当然,你可以把这个文件拷贝一份,一个用于正常执行,一个用于调试执行。


 
船长 @ 2009-03-26 09:54

我也不喜欢MFC,但还是有一点不同的意见,做什么东西都不要太主观。:)


[quote]原帖由 [i]elution[/i] 于 2006-12-10 10:33 发表
[color=Red]今天看到一篇关于GTK+和MFC对比的文章,学GTK+编程的来看看[/color]

MFC已经江河日下,日渐式微,而GTK+可谓欣欣向荣,如日中天。这里无意于落井下石,痛打落水狗,贬MFC而尊GTK+。自己即在使用MFC也在使用 GTK+,不会偏袒其中之任何一方。这个对比完全出于个人对两者的理解,说它是不完全对比,一方面只是一时兴起想做个笔记而已,另外一方面我对两者的理解 也是有限的。
[/quote]

MFC的日渐式微和GTK+的如日中天没有可比性,
没见过GTK+在Windows平台的"如日中天",
而且两种情况都是针对特定群体。

[quote]
1.         两者都是基于面向对象设计的。尽管MFC是用C++写的,而GTK+是用C写的,但思想都是面向对象的。GTK+使用glib的对象机制,由于用C写的,其实现相对有点繁琐。
[/quote]

令人觉得麻烦的是 GTK+ 写的东西长度怎么那么长... :)

[quote]
2.         两者都是基于消息驱动的。这是GUI系统的共性,消息可以是硬件上报的,如鼠标事件、键盘事件和触摸屏等等,也可以是程序产生,如一个窗口给另外一个窗 口发送了一个消息。但两者并不完全相同,GTK+通过select挂在多个文件描述符上,可以同时等待多个事件源,比如socket、子进程退出和内核事 件等等,而MFC只能通过GetMessage挂到消息队列上。
[/quote]

两种方式各有优缺点,从效率来说,我比较偏向 MessageQueue 方式。

[quote]
3.         两者都不是线程安全的,即只有一个线程可以操作GUI资源。主要是出于性能的考虑,这个问题不大,因大多数应用程序都是单线程的。而且它们都提供一些机 制,让其它线程可以在必要时操作GUI资源。在GTK+中可以通过idle函数来实现,在MFC中可以通过PostMessage来实现(附带说明一下: Win32原生的GUI API是线程安全的)。
[/quote]

GTK+ 在 v1.2 后的版本在特定情况下是可以做到线程安全的,gdk_threads_enter/gdk_threads_leave
MFC 是不建议你在不明白相应条件下使用多线程,而建议从工作者线程(听着怎么那么别扭) PostMessage 到主线程去处理。

[quote]
4.         GTK+整合了一系列的基础函数库,功能强大,而MFC孤军做战,势单力薄。Glib是GTK+的基本库,里面实现了常见的容器和算法,可谓应有尽有, 同时隔离了平台相关的功能。Pango是GTK+用于文字渲染的函数库,它负责控制不同文字的layout布局,而把字模的绘制交给freetype等字 体函数库处理。MFC虽然实现了一些容器,但数量不多也不好用,除了对原生GUI API的包装外,没提供多少其它功能,与Microsoft Foundation Class Library这个名称一点都不相称。
[/quote]

当你真正用 pango 去处理实际的东西时你会发觉他除了所谓的功能强大外就是效率低下。
不要一味的否定 MFC, 它是没有必要再去实现或包装一些 Win32 API 已经有的东西。

[quote]
5.         GTK+是跨平台的,而MFC则不是。GTK+在设计时就考虑了可移植性,它按分层模型来组织整个系统,Glib封装了依赖于OS平台的函数,提供一套 抽象的接口,在不同的平台有不同的实现。GDK封装了依赖于输入/输出设备的功能,如键盘事件的获取和显示缓冲的输出,同时实现了基本的绘图功能。GTK +几乎可以在所有PC平台下运行,而MFC从来都没有考虑过可移植性,它是与Win32 GUI绑定在一起的。
[/quote]

GTK+ 不能几乎可以在所有PC平台下运行,它运行的最好的也就是在 X Window 下而已。
MFC 不可能考虑跨操作系统,最多就是 X86/PowerPC/MIPS 等。

[quote]
6.         GTK+小巧,而MFC笨重。GTK+编译出来的可执行文件约3M左右,而MFC本身虽然不大,但它各种版本加在一起就可观了。MFC有ansi版本、 有unicode版、有debug版、有release版、还有一些组合,如果你因此而晕倒了,那是很正常的。
[/quote]

你看看 GTK+ 依赖的库就不会说 GTK+ 小巧,而 MFC 依赖的库同样 GTK+ for Win32 都需要。

[quote]
7.         GTK+的使用简单,MFC的使用繁琐。GTK+的使用比较简单,即使在没有工具的帮助下,要写一个GTK+的应用程序也不难,实际上绝大多数GTK+ 应用程序都是一行代码一行代码的敲出来的。而MFC的使用则太麻烦了,很难想象没有VC的向导的帮助,写一个基于MFC的应用程序。即有了VC的向导,仍 有大量的程序员说MFC很难用。
[/quote]

"GTK+的使用简单,MFC的使用繁琐" 不敢苟同
即使没有任何向导,我可以只用 gvim+gcc+msdn 写 MFC 的程序,你信不信,事实上也有很多人这么做。
VC 的傻瓜向导和 Glade 的界面编辑一样,要知道原来基础的东西才能事半功倍,否则就一样是误认子弟。

[quote]
8.         GTK+使用signal机制,解开消息源与消息目标之间耦合。而MFC使用消息,将消息源与消息目标硬编码在一起。Signal的好处是,不需要知道 目标是谁,谁关心谁就注册,这种出版订阅机制是解耦的最佳方式。而MFC的消息则是必须知道目标是谁,把消息源与消息目标死死的绑在一起。MFC提供了一 套文档/视图框架,实现了类似出版订阅的功能,这本是设计者引以自豪的东西,结果因为太复杂不能被人理解,反而为开发人员所诟病。
[/quote]

GTK+ 的 signal 机制只是由于它是因 glib 引起的必然而已,不要把它吹的如何如何。
X Window/Win32 API 等哪个不是用消息队列,存在这么久必然有其道理。
个人更偏向于使用那种随时可以把消息转来转去的消息队列,如 BeOS API,你说它耦合性太强吧,易用就好 :)

[quote]
9.         GTK+采用layout机制动态计算各子窗口的坐标位置,自适应屏幕大小的变化。而MFC要求子窗口的坐标位置硬编码,结果要适应不同分辨率的屏幕非 常困难。GTK+在窗口布局时分为两个阶段,第一个阶段父窗口先询问子窗口的最佳大小,第二个阶段父窗口根据自己的大小计算子窗口的实际大小,子窗口根据 实际大小进行调整。
[/quote]

GTK+ 的 layout 你在试试在 table 中去自由控制吧,除非你用后来才实现的 fixed。
理想中: 又能自由控制位置,又能根据最佳大小调整。我只在 BeOS API 中见过。

[quote]
10.     GTK+采用容器机制来合理分离控件的职责,MFC没有容器这个概念,很难实现递归组合。GTK+中差不多所有控件都是容器,都可以容纳其它任何控 件,而MFC只有顶层窗口才是容器,可以容纳其它子控件。容器这个概念对代码重用的影响非常之大,这里举两个例子:其一是带图片的按钮 (BitmapButton),在GTK+中它就是GtkImage和GtkLabel的组合,而在MFC中,图片和文字都要自己绘制。前者的 GtkImage和GtkLabel可以在很多地方重用,而后都的绘制代码和事件处理代码只有自己才能使用。其二是列表框,在GTK+中,它只是一个容 器,你可以向里面放编辑器、下拉框和其它任何者你想得到的控件。而在MFC中,即使只是实现一个不同外观的列表框,你都要采用自绘的方式,代码重用非常困 难,向列表框中加入其它控件就更麻烦了,要使用一些非同寻常的手段不可。
[/quote]

要是你想,同样可以给 MFC 增加象容器的功能。

[quote]
11.     GTK+采用容器机制优先使用组合而不是继承,符合现代设计的原则。MFC强制使用继承,使用麻烦而且耦合紧密。GTK+应用程序不需要继承任何窗 口。MFC应用程序必须继承对话框或者其它顶层窗口才行,虽然可以采用中介者模式,把控件之间的交互集中在顶层窗口中,不需要继承控件,但仍然很麻烦。
[/quote]

继承不是好办法,但"继承+消息"确是你永远想不到的理想。
MFC 也是可以类似 QT 的 SIGNAL/SLOT 的。
GTK+ 使用 signal 机制,不要说现代,其实就是消息驱动,它也有继承的机制,你写个 GtkWidget 就知道。


 
船长 @ 2009-03-26 09:53

ctl+alt+backspace to kill x, and to get back to the gui login screen.


 
船长 @ 2008-10-31 16:13

Win32应用程序中进程间通信方法分析与比较

1
进程与进程通信

 

  进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指不同进程间进行数据共享和数据交换。
  正因为使用Win32 API进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题,下面本文将对Win32中进程通信的几种方法加以分析和比较。

 

2 进程通信方法

2.1 文件映射
  文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。
  Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。
  应用程序有三种方法来使多个进程共享一个文件映射对象。
  (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。
  (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。
  (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。
  文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。
2.2 共享内存
  Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
2.3 匿名管道
  管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
  匿名管道(Anonymous Pipe)是在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。
  匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
2.4 命名管道
  命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
  命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
2.5 邮件槽
  邮件槽(Mailslots)提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。
  通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
  邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一种选择。
2.6 剪贴板
  剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
  剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
2.7 动态数据交换
  动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
  DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交换方式:
  (1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
  (2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
  (3) 热链:当数据交换时服务器自动给客户发送数据。
  DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。
2.8 对象连接与嵌入
  应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。
  同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。
2.9 动态连接库
  Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。
  虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。
2.10 远程过程调用
  Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。
  由于Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。
2.11 NetBios函数
  Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。
2.12 Sockets
  Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。
  现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。
2.13 WM_COPYDATA消息
  WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。
  WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

 

3 结束语

  Win32 API为应用程序实现进程间通信提供了如此多种选择方案,那么开发者如何进行选择呢?通常在决定使用哪种IPC方法之前应考虑下一些问题,如应用程序是在网络环境下还是在单机环境下工作等。



 
日 历
个 人 简 介
· 姓名:船长
· 学历:博士
· 院校:中科院
· 给我留言
网志文件夹
· 所有网志
· vc++编程
· Linux
· OpenGL
· MatLab
· Protel
· 单片机开发
· 课题相关
· 虚拟现实
· 电脑应用
· 奇文欣赏
· 乱七八糟
· 我的开发日志
· 数据手套
· 未分类
最 新 的 评 论
搜 索
友 情 链 接
· 歪酷博客
· 管理我的Blog
· 山城棒棒儿的MATLAB世界
· 西陆社区
· 中国数学建模
· 精诚电子设计
· SimWe---仿真论坛
· 研学论坛
· 中国软件-技术频道
· 我的U盘
· Azure个人博客OpenGL、CG Language、游戏构架...

订阅 RSS

0175862

狗狗评测:PageRank

歪酷博客