OrderBook View is threadsafe now

This commit is contained in:
7u83 2016-12-28 15:20:58 +01:00
parent 806a74014d
commit ce24a82442
6 changed files with 75 additions and 33 deletions

View File

@ -7,25 +7,24 @@
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Trader.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/TraderRun.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/MTrader.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/build.xml</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Order.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/ControlPanel.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/OrderBookPanel.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/MainWin.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/OrderBook.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/manifest.mf</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Traders/RandomTrader.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Account.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Exchange.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/Chart.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/OrderBookCell.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/AskBook.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/BidBook.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/build.xml</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/OrderBookPanel.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/RandomTrader.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/ThreadedTrader.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/TraderRunner.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/BuyOrder.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Traders/ManTrader.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/README.md</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/AskBook.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Logger.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/Gui/BidBook.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/src/SeSim/SellOrder.java</file>
<file>file:/home/tube/NetBeansProjects/SeSim/LICENSE</file>
</group>

View File

@ -37,7 +37,7 @@ public class AskBook extends OrderBook {
@Override
ArrayList getOrderBook() {
return MainWin.se.getOrderBook(OrderType.ask,10);
return MainWin.se.getOrderBook(OrderType.ask,40);
}
@Override

View File

@ -73,6 +73,7 @@
<Column editable="false" title="Title 3" type="java.lang.Object"/>
</Table>
</Property>
<Property name="doubleBuffered" type="boolean" value="true"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>

View File

@ -28,10 +28,9 @@ package Gui;
import SeSim.Exchange;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.concurrent.Callable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.SwingUtilities;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
@ -40,17 +39,20 @@ import javax.swing.table.*;
*
* @author 7u83 <7u83@mail.ru>
*/
/**
* OderBook Class
* OderBook Class
*/
public abstract class OrderBook extends javax.swing.JPanel implements Exchange.BookReceiver{
public abstract class OrderBook extends javax.swing.JPanel implements Exchange.BookReceiver {
OrderBookListModel model;
abstract ArrayList getOrderBook();
private Color hdr_color = Color.LIGHT_GRAY;
private class OrderBookCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
@ -62,19 +64,35 @@ public abstract class OrderBook extends javax.swing.JPanel implements Exchange.B
return renderer;
}
}
@Override
@Override
public void UpdateOrderBook() {
// System.out.print("I have got an update on bid\n");
model.update();
class Updater implements Runnable{
OrderBookListModel model;
ArrayList newlist;
@Override
public void run() {
model.update(this.newlist);
}
Updater(OrderBookListModel model, ArrayList newlist){
this.model = model;
this.newlist = newlist;
}
}
ArrayList newlist = getOrderBook();
SwingUtilities.invokeLater(new Updater(this.model,newlist));
}
boolean getDesc() {
return false;
}
protected OrderBookListModel model;
// protected OrderBookListModel model;
protected class OrderBookListModel extends AbstractTableModel {
@ -82,15 +100,24 @@ public abstract class OrderBook extends javax.swing.JPanel implements Exchange.B
private boolean desc = false;
public OrderBookListModel() {
update();
}
public void update(){
System.out.print("CREATING A NEW MODEL\n");
// update();
list = getOrderBook();
this.fireTableDataChanged();
}
int update_calls = 0;
int colcount_calls = 0;
public void update(ArrayList newlist) {
list = newlist; //getOrderBook();
this.fireTableDataChanged();
this.update_calls++;
int hc = this.hashCode();
System.out.print("Update/ColCalls = " + update_calls + "/" + colcount_calls + " HC: " + hc + "\n");
}
@Override
public String getColumnName(int c) {
switch (c) {
@ -106,6 +133,8 @@ public abstract class OrderBook extends javax.swing.JPanel implements Exchange.B
@Override
public int getRowCount() {
colcount_calls++;
System.out.print("Update/ColCalls = " + update_calls + "/" + colcount_calls + "\n");
return list.size();
}
@ -117,6 +146,10 @@ public abstract class OrderBook extends javax.swing.JPanel implements Exchange.B
@Override
public Object getValueAt(int r, int c) {
SeSim.Order o;
int s = list.size();
//System.out.print("Looking for Value at" + r + ":" + c + " w size:" + s + "\n");
if (!getDesc()) {
o = (SeSim.Order) list.get(r);
} else {
@ -150,9 +183,9 @@ public abstract class OrderBook extends javax.swing.JPanel implements Exchange.B
return;
}
model = new OrderBookListModel();
this.model = new OrderBookListModel();
this.orderBookList.setModel(model);
orderBookList.setBorder(BorderFactory.createEmptyBorder());
JTableHeader h = this.orderBookList.getTableHeader();
@ -219,6 +252,7 @@ public abstract class OrderBook extends javax.swing.JPanel implements Exchange.B
return canEdit [columnIndex];
}
});
orderBookList.setDoubleBuffered(true);
orderBookList.setFocusable(false);
orderBookScroller.setViewportView(orderBookList);

View File

@ -84,7 +84,15 @@ public class Exchange extends Thread {
while (i.hasNext()) {
i.next().UpdateOrderBook();
}
/* try {
sleep(50);
} catch (InterruptedException e) {
System.out.println("I was Interrupted");
}
*/
}
// Here we store the list of quote receivers
private final TreeSet<QuoteReceiver> qrlist;

View File

@ -55,7 +55,7 @@ public class RandomTrader extends Trader {
private boolean monitorTrades() {
int numpending = account.pending.size();
System.out.print("RT: Monitoring trades - Pending: "+numpending+"\n");
// System.out.print("RT: Monitoring trades - Pending: "+numpending+"\n");
if (numpending == 0) {
System.out.print("RT: pending = 0 - return false\n");
return false;
@ -64,7 +64,7 @@ public class RandomTrader extends Trader {
Order o = account.pending.get(0);
long age = o.getAge();
System.out.print("RT: age is: "+age+"\n");
// System.out.print("RT: age is: "+age+"\n");
if (age > 10000) {
account.se.CancelOrder(o);
@ -72,14 +72,14 @@ public class RandomTrader extends Trader {
return false;
}
System.out.print("RT: monitor return true\n");
//System.out.print("RT: monitor return true\n");
return true;
}
public void trade() {
System.out.print("RT: Now trading\n");
// System.out.print("RT: Now trading\n");
if (monitorTrades()) {
return;