b***i 发帖数: 3043 | 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:
| h*****0 发帖数: 4889 | 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){
| b***i 发帖数: 3043 | 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 (x
setCaretPosition(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){
| h*****0 发帖数: 4889 | 4 你都说了死机是死在主循环。不看主循环怎么知道为什么呢。
【在 b***i 的大作中提到】 : @Override : public void keyTyped(KeyEvent e) { : keytyped=e.getKeyChar();// keynum; : switch (keymode) : { : case 0: : e.consume(); : return; : case 2: : case 3:
| b***i 发帖数: 3043 | 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 的大作中提到】 : 你都说了死机是死在主循环。不看主循环怎么知道为什么呢。
| q*********u 发帖数: 280 | 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");
| d*****d 发帖数: 180 | 7 main thread is also used to dispatch events. things will lock up is main
thread is waiting for lock. | h*****0 发帖数: 4889 | 8 是的。GUI程序主线程循环不停在java里是不太好的做法。
【在 d*****d 的大作中提到】 : main thread is also used to dispatch events. things will lock up is main : thread is waiting for lock.
| b***i 发帖数: 3043 | 9 真是一语道破梦中人。
我的目的,就是实现dos这样的文本窗口,同时有一些按钮等。这样,我的主程序等待
semaphore,然后按下按钮,或者回车就release semaphore。
看来,应该做一个actionprocess函数,然后根本没有主程序的等待,直接在按下回车
或者按钮的时候在keypressed或者菜单action里面call actionprocess,尽快完成任务
,比如打开文件,命令处理等,反正源头都是GUI的活动。
【在 h*****0 的大作中提到】 : 是的。GUI程序主线程循环不停在java里是不太好的做法。
|
|