
看了楼上的回复,推荐你一个简单点的方式。解决此类问题。既不让按钮失效,也不放代码逻辑多次排队运行。利用锁的概念就可以了。简要代码如下:
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++编程银行排队系统模拟的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)