什么是JFrame关闭的正确方法,就像用户点击X关闭按钮或按下Alt+ F4(在Windows上)一样?
我通过以下方式设置我的默认关闭操作:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Run Code Online (Sandbox Code Playgroud)
它完全符合我想要的上述控件.这个问题与此无关.
我真正想要做的是使GUI的行为方式与按下X关闭按钮会使其表现相同.
假设我要扩展WindowAdaptor然后添加我的适配器实例作为监听器addWindowListener().我想看到的调用相同的序列通过windowDeactivated(),windowClosing()以及windowClosed()作为将与出现X关闭按钮.可以这么说,撕毁窗户就像告诉它撕裂自己一样.
为自定义CPU创建C编译器最简单的方法是什么,假设我当然已经有了汇编程序?
由于C编译器生成汇编,是否有一些方法可以为各种C语言定义标准位和汇编代码片段,重建编译器,从而获得目标硬件的交叉编译器?
优选地,编译器本身将用C编写,并且构建为Linux或Windows的本机可执行文件.
请注意:我不是在问如何编写编译器本身.我确实在大学里学过这门课程,我知道一般的编译器编译器等等.在这种情况下,我只想配置一些现有的框架,如果可能的话.我不想修改语言,我只是希望能够定位任意架构.如果答案结果是"它不会那样工作",那么这些信息对我自己和其他可能做出类似假设的人都有用.
那个java原始整数(int)是原子的吗?两个共享一个int的线程的一些实验似乎表明它们是,但当然没有证据表明它们不是并不暗示它们是.
具体来说,我跑的测试是这样的:
public class IntSafeChecker {
static int thing;
static boolean keepWatching = true;
// Watcher just looks for monotonically increasing values
static class Watcher extends Thread {
public void run() {
boolean hasBefore = false;
int thingBefore = 0;
while( keepWatching ) {
// observe the shared int
int thingNow = thing;
// fake the 1st value to keep test happy
if( hasBefore == false ) {
thingBefore = thingNow;
hasBefore = true;
}
// …Run Code Online (Sandbox Code Playgroud) 使用单核处理器,所有线程都从一个CPU运行,在内存中的某些互斥(或信号量等)上使用原子测试和设置操作实现关键部分的想法似乎很简单; 因为你的处理器正在从程序中的一个位置执行测试和设置,所以它一定不能从程序中的另一个位置伪装成其他线程.
但是当你真的拥有多个物理处理器时会发生什么?似乎简单的指令级原子性是不够的,b/c有两个处理器可能同时执行它们的测试和设置操作,你真正需要保持原子性是访问共享内存位置的互斥.(如果共享内存位置被加载到缓存中,那么整个缓存一致性也要处理...)
这似乎比单核案例带来更多的开销,所以问题的关键在于:它有多糟糕?更糟糕吗?我们只是忍受它吗?或者通过强制执行一个策略来回避它,即进程组中的所有线程都必须位于同一个物理核心上?
我正在尝试将一个ram驻留图像放到校验和本身,这说起来容易做起来难.
代码首先在交叉开发平台上编译,生成.elf输出.实用程序用于去除二进制图像,并将该图像与图像大小一起刻录到目标平台上的闪存.当目标启动时,它会将二进制文件复制到ram的正确区域,并跳转到它.该实用程序还会计算精灵中所有用于ram的单词的校验和,并且这些单词也会被刻录到闪存中.所以我的图像理论上可以使用先验的起始地址和闪存中保存的大小来校验自己的ram驻留图像,并与闪存中保存的总和进行比较.
无论如何,这就是理论.问题是图像开始执行后,.data随着变量的修改,部分会发生变化.到总和时,已经求和的图像不再是效用计算总和的图像.
我已经消除了由于我的应用程序定义的变量导致的更改,通过在应用程序中的所有其他初始化之前移动校验和例程(这有意义b/c为什么在完整性检查失败时运行任何一个,对吧?),但是杀手是C运行时间本身.似乎有一些与之相关的项目malloc和指针转换以及main()甚至在输入之前被改变的其他事物.
自我校验和C代码的整个想法是蹩脚的吗?如果有办法强制app和CRT .data进入不同的部分,我可以避免CRT捶打,但有人可能会争辩说,如果目标是在执行(大部分)之前检查图像,那么初始化的CRT数据应该成为其中的一部分.有没有办法像这样在RAM中进行代码校验和?
FWIW,我似乎坚持要求.就个人而言,我认为要走的路是在转移到ram之前校验闪存中的二进制文件,并信任加载器和ram.偏执狂必须在某个地方结束吧?
其他细节:工具链是GNU,图像包含.text,.rodata并.data作为一个连续加载的块.没有操作系统,这是裸机嵌入式.主加载器本质上memcpy是我的二进制文件,在预定的地址.没有重新安置.VM未使用.校验和仅需要在init初始化一次.
更新 通过这样做发现..
__attribute__((constructor)) void sumItUp(void) {
// sum it up
// leave result where it can be found
}
Run Code Online (Sandbox Code Playgroud)
..除了CRT init 初始化malloc/ sbrkvars以及"impure.o"和"locale.o"拥有的一些变量之外,我几乎可以完成所有操作.现在,malloc/ sbrkvalue是我从项目链接器脚本中知道的.如果impure.o和locale.o可以减轻,可能会有业务.
更新 因为我可以控制入口点(通过闪存中为主加载器说明的内容),现在似乎最好的攻击角度是使用一段自定义汇编程序代码来设置堆栈和sdata指针,调用校验和例程,然后分支到"正常"_start代码.
这可能是有史以来最简单的win32程序..
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdLine, int show)
{
MessageBox(0, "Hello world..", "Salutations!", MB_OK);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
..对通常的GetMessage()调用没有任何调用.我的问题是:如果我的程序没有处理任何窗口消息,操作系统可以应对吗?即,它是否会导致内存泄漏?或者其他一些不明显的资源,除非我运行16K次?
从更广泛的意义上讲,Win32对于处理邮件的应用程序究竟是如何"依赖"的?我希望当编译器将可执行文件链接为Windows程序时,运行时将能够清理任何类型的消息队列,无论是否清空.
WinMain的第3个参数提供命令行作为未处理的字符串.虽然这对于允许你应对通配符扩展以及什么不是很有用,但是有没有机会潜伏在Win32 API的某个地方,有办法获得通常的C argc,argv版本吗?
假设我有两个文件,A和B,以及lengthOf(A)<lengthOf(B).是否有一个unix实用程序来判断文件B是否为第一个lengthOf(A)字节重复文件A?
如果我做"diff A B",输出将是B文件中的所有'额外的东西',它会错过这个点; 我不在乎文件B中还有什么.
如果我做"通信A B",那么我必须目视检查"仅在A中"列中没有任何内容.当lengthOf(B)>> lengthOf(A)时,这可能很难,但我想它可以用grep驯服.
当您的一组 .h 文件陷入了经典“棘手问题”的情况(#include 一个 .h 意味着您最终会包含几乎所有文件)时,您会怎么做?预防显然是最好的良药,但是如果在供应商(!)发货之前发生这种情况,您该怎么办?
这是问题的扩展,这可能是更相关的问题——您是否应该首先尝试理清依赖关系?
当我使用vim或gvim进行搜索时,光标在窗口中的最终定位有些随机,太频繁地落在窗口的最后一行(或第一行)上.搜索突出显示有帮助,但是仍然很麻烦,必须在屏幕上四处寻找光标...而且有点讽刺的是,在vim找到一个兆字节长的日志文件中的下一个结果后,我必须使用ol 'neocortex将它与最后的4K左右隔离开来.
我可以通过在每次搜索后点击'zz' 来手动获得我想要的效果,但我更愿意通过医生我的_vimrc来自动实现这一点.