winfrom 快速点击button按钮,程序会卡死

winfrom 快速点击button按钮,程序会卡死,第1张

看了楼上的回复,推荐你一个简单点的方式。解决此类问题。既不让按钮失效,也不放代码逻辑多次排队运行。利用锁的概念就可以了。简要代码如下:

public bool t_status = true;

public object t_object = new object();

private void button11_Click()

{

if(t_status)

{

lock(t_object)

{

t_status = false;

}

//逻辑代码模块

//处理完之后

lock (t_object)

{

t_status = true;

}

}

}

以此来确保只有当t_status为true的时候,才会执行以此逻辑代码。其他则不执行。不影响前台代码UI响应。当然用多线程或者其他的解决UI线程 *** 作问题会有更好的效果。望采纳。敲字不易

{n个人排队到r个水龙头打水}

var

n,r,i,j,k,p,q:integer;

t:array[1200] of integer;        {原始队列}

tt:array[050,0100] of integer; {分成r个队列}

s,sum:longint;

f:text;

begin

assign(f,'排队打水in');

reset(f);

readln(f,n,r);

for i:=1 to n do read(f,t[i]);

close(f);

for i:=1 to n-1 do for j:=i+1 to n do

if t[i]>t[j] then begin k:=t[i];t[i]:=t[j];t[j]:=k; end;

for p:=0 to 50 do for q:=0 to 100 do tt[p,q]:=0;

{以下将一维数组变为二维数组}

for i:=1 to n do begin

p:=(i-1) mod r;    {p,q都是从0开始,p为行,q为列}

q:=(i-1) div r;

tt[p,q]:=t[i];

end;

{以下一个龙头对应一个队列,共r个队列,计算队列内部每个人用时}

for p:=0 to r-1 do for q:=1 to (n-1) div r do 

if tt[p,q]<>0 then tt[p,q]:=tt[p,q]+tt[p,q-1]; 

 

{以下计算每个队列的总用时及其总和}

sum:=0;

for p:=0 to r-1 do begin

s:=0;

for q:=0 to (n-1) div r do 

if tt[p,q]<>0 then s:=s+tt[p,q];

sum:=sum+s;

end;

writeln(sum);

end

可以有两种结构:

1 就是像你说的写一个服务器+ 一个客户端程序,服务器管理所有数据及给客户端回应

客户端可以开N个程序,模拟银行的N个窗口

每一个都跟服务器进行通信,这涉及到网络编程,难度比较大优点结构比较稳定,所有服务由服务器进行调度,安全

2 就是只写一个应用程序,运行时可运行N个,但都共用一个数据源(数据库数据)

程序一接到响应就去数据库中检查当前有哪些地排队,选号最小的报只涉及到数据库编程,但有一个致命缺点就是:当你开窗口很多,几个程序同时申请报号时,程序会在同一时间去检查数据库中的同一条记录,这个估计有点麻烦,就是不支持并发的意思

简单提示到这里,其它自己研究吧

有问题随时准备共同探讨

import javaawtColor;

import javaawteventActionEvent;

import javaawteventActionListener;

import javaawteventWindowAdapter;

import javaawteventWindowEvent;

import javaxswingButtonGroup;

import javaxswingJButton;

import javaxswingJFrame;

import javaxswingJLabel;

import javaxswingJPanel;

import javaxswingJTextField;

public class BankWaiting extends JFrame implements ActionListener {

int total = 0, now = 0;

boolean is1Ready = false, is2Ready = false, is3Ready = false;

int call1, call2, call3;

JFrame jf;

JLabel jr, jl, jl1, j2, jl2, j3, jl3;

JTextField jr4;

JButton jb, jb1, jb2, j1;

JButton workBut1, workBut2, workBut3;

JPanel jp, jp1, jp2;

public BankWaiting() {

setLayout(null);

jf = new JFrame("银行叫号程序");// 窗体

jr = new JLabel("请号到号窗口办理业务");

jrsetBounds(300, 10, 800, 50);

jrsetForeground(Colorred);

j1 = new JButton("取号");

j1addActionListener(this);

jr4 = new JTextField("欢迎");

jr4setEditable(false);

ButtonGroup bg = new ButtonGroup();

bgadd(j1);

jp = new JPanel();

jl = new JLabel("一号窗口");

jl1 = new JLabel("一号窗口,欢迎你!");

jb = new JButton("下一位");

workBut1 = new JButton("开始办理");

workBut1addActionListener(this);

jbaddActionListener(this);

jpsetBackground(Colorpink);

jpsetSize(200, 80);// 大小

jpsetLocation(20, 120); // 位置

jfsetLayout(null);

jp1 = new JPanel();

j2 = new JLabel("二号窗口");

jl2 = new JLabel("二号窗口,欢迎你!");

jb1 = new JButton("下一位");

workBut2 = new JButton("开始办理");

jb1addActionListener(this);

workBut2addActionListener(this);

jp1setBackground(Colorpink);

jp1setSize(200, 80);// 大小

jp1setLocation(250, 120); // 位置

jfsetLayout(null);

jp2 = new JPanel();

j3 = new JLabel("三号窗口");

jl3 = new JLabel("三号窗口,欢迎你!");

jb2 = new JButton("下一位");

workBut3 = new JButton("开始办理");

workBut3addActionListener(this);

jb2addActionListener(this);

jp2setBackground(Colorpink);

jp2setSize(200, 80);// 大小

jp2setLocation(500, 120); // 位置

jfsetLayout(null);

jfadd(jp);

jfadd(jp1);

jfadd(jp2);

jfadd(jr);

jpadd(jl);

jpadd(jl1);

jpadd(jb);

jpadd(workBut1);

jp1add(j2);

jp1add(jl2);

jp1add(jb1);

jp1add(workBut2);

jp2add(j3);

jp2add(jl3);

jp2add(jb2);

jp2add(workBut3);

jfadd(j1);

jfadd(jr4);

j1setBounds(550, 300, 60, 30);

jr4setBounds(300, 300, 200, 40);

jfsetSize(800, 600);

jfsetVisible(true);

jfaddWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

Systemexit(0);

}

});

}

public void actionPerformed(ActionEvent e) {

String s = "";

if (egetSource() == j1) {

s = "第" + (++total) + "号,前面还有" + (total - now - 1) + "位顾客!";

jr4setText(s);

}

if (egetSource() == jb) {

if (thishasCustomers()) {

s = "请" + (++now) + "号顾客到一号窗口办理";

call1 = now;

jl1setText(s);

jrsetText(s);

is1Ready = true;

} else {

s = "当前已经没有顾客了";

jl1setText(s);

is1Ready = false;

}

} else if (egetSource() == jb1) {

if (thishasCustomers()) {

s = "请" + (++now) + "号顾客到二号窗口办理";

call2 = now;

jl2setText(s);

jrsetText(s);

is2Ready = true;

} else {

s = "当前已经没有顾客了";

jl2setText(s);

is2Ready = false;

}

} else if (egetSource() == jb2) {

if (thishasCustomers()) {

s = "请" + (++now) + "号顾客到三号窗口办理";

call3 = now;

jl3setText(s);

jrsetText(s);

is3Ready = true;

} else {

s = "当前已经没有顾客了";

jl3setText(s);

is3Ready = false;

}

}

if (egetSource() == workBut1) {

if (is1Ready) {

s = call1 + "号顾客正在办理业务。。。";

jl1setText(s);

is1Ready = false;

}

} else if (egetSource() == workBut2) {

if (is2Ready) {

s = call2 + "号顾客正在办理业务。。。";

jl2setText(s);

is2Ready = false;

}

} else if (egetSource() == workBut3) {

if (is3Ready) {

s = call3 + "号顾客正在办理业务。。。";

jl3setText(s);

is3Ready = false;

}

}

}

public boolean hasCustomers() {

if (now < total) {

return true;

} else {

return false;

}

}

public static void main(String[] args) {

new BankWaiting();

}

}

以上就是关于winfrom 快速点击button按钮,程序会卡死全部的内容,包括:winfrom 快速点击button按钮,程序会卡死、排队打水的参考程序主要框架pascal、一个关于C++编程银行排队系统模拟的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10077016.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存