Redian新闻
>
keyPressed(KeyEvent e) 需要考虑重入吗
avatar
keyPressed(KeyEvent e) 需要考虑重入吗# Java - 爪哇娇娃
b*i
1
程序生成了一个类似dos的窗口,等待用户输入。
主程序用了一个循环,里面等待semaphore,这个semaphore是窗口部分的KeyPressed里
面released
我的窗口部分keypressed, keyreleased, keytyped都重写了。在一个1.7G CPU的电脑
上,没有问题,是eclipse来编译运行。然后load到网上成为applet,在2.2G 双核的电
脑上,运行快了。但是,如果连续按下Enter, 会出现几个换行后,死机。体现在等待
semaphore,但是我看到打印的信息,最后semaphore等待的时候,keypressed根本没有
进入。为什么按下一个键却没有进入
keypressed?
public void keyPressed(KeyEvent e){
DEBUG("-->");
keypressed= e.getKeyCode();
if (keymode==3){
switch(keypressed){
case KeyEvent.VK_Enter:
avatar
h*0
2
主程序里在“循环”。这个是最有可能出问题的地方。贴代码啊。

【在 b***i 的大作中提到】
: 程序生成了一个类似dos的窗口,等待用户输入。
: 主程序用了一个循环,里面等待semaphore,这个semaphore是窗口部分的KeyPressed里
: 面released
: 我的窗口部分keypressed, keyreleased, keytyped都重写了。在一个1.7G CPU的电脑
: 上,没有问题,是eclipse来编译运行。然后load到网上成为applet,在2.2G 双核的电
: 脑上,运行快了。但是,如果连续按下Enter, 会出现几个换行后,死机。体现在等待
: semaphore,但是我看到打印的信息,最后semaphore等待的时候,keypressed根本没有
: 进入。为什么按下一个键却没有进入
: keypressed?
: public void keyPressed(KeyEvent e){

avatar
b*i
3
@Override
public void keyTyped(KeyEvent e) {
keytyped=e.getKeyChar();// keynum;
switch (keymode)
{
case 0:
e.consume();
return;
case 2:
case 3:
int x=this.getCaretPosition();
if (xsetCaretPosition(sD.getLength());
break;
}
}
然后,我在下面的keypressed中加入if (keymode==0){e.consume();return}就不死机
了。
我的问题,我在回车按下的时候,keypressed进入了,再没退出前,Enter一直按着,
keytype可能进入,然后consume我的回车吗?
public void keyPresse

【在 b***i 的大作中提到】
: 程序生成了一个类似dos的窗口,等待用户输入。
: 主程序用了一个循环,里面等待semaphore,这个semaphore是窗口部分的KeyPressed里
: 面released
: 我的窗口部分keypressed, keyreleased, keytyped都重写了。在一个1.7G CPU的电脑
: 上,没有问题,是eclipse来编译运行。然后load到网上成为applet,在2.2G 双核的电
: 脑上,运行快了。但是,如果连续按下Enter, 会出现几个换行后,死机。体现在等待
: semaphore,但是我看到打印的信息,最后semaphore等待的时候,keypressed根本没有
: 进入。为什么按下一个键却没有进入
: keypressed?
: public void keyPressed(KeyEvent e){

avatar
h*0
4
你都说了死机是死在主循环。不看主循环怎么知道为什么呢。

【在 b***i 的大作中提到】
: @Override
: public void keyTyped(KeyEvent e) {
: keytyped=e.getKeyChar();// keynum;
: switch (keymode)
: {
: case 0:
: e.consume();
: return;
: case 2:
: case 3:

avatar
b*i
5
多谢牛人帮忙啊。
不过不是死在主循环,因为主循环在等semaphoore, 这个semaphore在GUI的keypressed
里面被release,而死机时我却看不到这个keypressed的进入,更没有release。
当时,我就一直按着enter,看到java console里面不停的显示主循环等semaphore, 进
入keypressed, 从某个if 里面release semaphore, 然后突然,停在主循环等待
semaphore那里了。我在keypressed里面入口的地方就显示进入keypressed,这个时候已
经不显示了。我怀疑keytyped把enter consumed了。
主循环在此
while (true){
kb.addPrintText("\n");
kb.prompt();
kb.EnterCommandMode(); // keymode is assigned to be 3
theGUI.waitCommand(); //等待semaphore


【在 h*****0 的大作中提到】
: 你都说了死机是死在主循环。不看主循环怎么知道为什么呢。
avatar
q*u
6
看上去应该是dead lock吧, semaphore都出来了, 肯定要仔细检查程序里面的逻辑了,
生产者消费者的关系会不会在那些if里面乱掉了

多谢牛人帮忙啊。
不过不是死在主循环,因为主循环在等semaphoore, 这个semaphore在GUI的keypressed
里面被release,而死机时我却看不到这个keypressed的进入,更没有release。
当时,我就一直按着enter,看到java console里面不停的显示主循环等semaphore, 进
入keypressed, 从某个if 里面release semaphore, 然后突然,停在主循环等待
semaphore那里了。我在keypressed里面入口的地方就显示进入keypressed,这个时候已
经不显示了。我怀疑keytyped把enter consumed了。
主循环在此
while (true){
kb.addPrintText("\n");
kb.prompt();
kb.EnterCommandMode(); // keymode is

【在 b***i 的大作中提到】
: 多谢牛人帮忙啊。
: 不过不是死在主循环,因为主循环在等semaphoore, 这个semaphore在GUI的keypressed
: 里面被release,而死机时我却看不到这个keypressed的进入,更没有release。
: 当时,我就一直按着enter,看到java console里面不停的显示主循环等semaphore, 进
: 入keypressed, 从某个if 里面release semaphore, 然后突然,停在主循环等待
: semaphore那里了。我在keypressed里面入口的地方就显示进入keypressed,这个时候已
: 经不显示了。我怀疑keytyped把enter consumed了。
: 主循环在此
: while (true){
: kb.addPrintText("\n");

avatar
d*d
7
main thread is also used to dispatch events. things will lock up is main
thread is waiting for lock.
avatar
h*0
8
是的。GUI程序主线程循环不停在java里是不太好的做法。

【在 d*****d 的大作中提到】
: main thread is also used to dispatch events. things will lock up is main
: thread is waiting for lock.

avatar
b*i
9
真是一语道破梦中人。
我的目的,就是实现dos这样的文本窗口,同时有一些按钮等。这样,我的主程序等待
semaphore,然后按下按钮,或者回车就release semaphore。
看来,应该做一个actionprocess函数,然后根本没有主程序的等待,直接在按下回车
或者按钮的时候在keypressed或者菜单action里面call actionprocess,尽快完成任务
,比如打开文件,命令处理等,反正源头都是GUI的活动。

【在 h*****0 的大作中提到】
: 是的。GUI程序主线程循环不停在java里是不太好的做法。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。