Jay, You forgot to open the callback stream. Try adding this:
$api->OpenCallbackStream() ; right before: > while ((my $rc = $api->WaitForCallback(.1)) > -1){ > if (! $rc){ My guess is that your are breaking out of the while loop with -1 and the main thread is finishing, leaving only the other threads running. Patrick On 12/25/05, Jay Strauss <[EMAIL PROTECTED]> wrote: > It doesn't seem to work across threads. Maybe I did it wrong. The > code below hangs once it tries to call the perl callback, requiring a > <ctrl>c as in: > > [EMAIL PROTECTED]:~/inline$ ./whole > Server Version:24 > TWS Time at connection:20051225 14:29:34 CST > inside nextValidId > <ctrl>c > > Do you see anything wrong or have suggestions? > > Thanks > Jay > > #!/usr/bin/perl > use strict; > > package my_callback; > > sub new { > my $class = shift; > > bless {}, $class; > } > > sub tickPrice { > > my $self = shift; > print join(":", @_),"\n"; > } > > sub nextValidId { > my $self = shift; > print join(":", @_),"\n"; > } > > package main; > > use Inline ( > Java => "DATA", > JNI => 1, > AUTOSTUDY => 1, > STUDY => ['com.ib.client.EClientSocket', > 'com.ib.client.Contract', > ], > ); > > my $callback = my_callback->new(); > my $api = Inline_Bridge->new($callback); > my $ib = com::ib::client::EClientSocket->new($api); > > $ib->eConnect("localhost","7496",$$); > > my $i = 1; > > foreach (qw/YHOO/) { > > my $contract = com::ib::client::Contract->new(); > $contract->{m_symbol} = $_; > $contract->{m_secType} = 'STK'; > $contract->{m_exchange} = 'SMART'; > > $ib->reqMktData($i++,$contract); > } > > while ((my $rc = $api->WaitForCallback(.1)) > -1){ > if (! $rc){ > } > else { > $api->ProcessNextCallback() ; > } > } > > __DATA__ > __Java__ > > import org.perl.inline.java.*; > import com.ib.client.*; > > class Inline_Bridge extends InlineJavaPerlCaller implements EWrapper { > > InlineJavaPerlObject perlobj; > > public Inline_Bridge(InlineJavaPerlObject PerlObj) > throws InlineJavaException { > perlobj = PerlObj; > } > > public void tickPrice(int tickerId, int field, double price, > int canAutoExecute) > > { > try { > perlobj.InvokeMethod( > "tickPrice", > new Object [] { > tickerId, field, price, canAutoExecute > } > ); > } > catch (InlineJavaPerlException pe){ } > catch (InlineJavaException pe) { pe.printStackTrace() ;} > } > > public void tickSize(int tickerId, int field, int size) > { > > } > > public void orderStatus(int orderId, String status, int filled, > int remaining, double avgFillPrice, int permId, > int parentId, double lastFillPrice, int clientId) > { > > } > > public void openOrder(int orderId, Contract contract, Order order) > { > > } > > public void error(String str) > { > > } > > public void connectionClosed() > { > > } > > public void updateAccountValue(String key, String value, String > currency, > String accountName) > { > > } > > public void updatePortfolio(Contract contract, int position, > double marketPrice, double marketValue, > double averageCost, double unrealizedPNL, > double realizedPNL, String accountName) { > } > > public void updateAccountTime(String timeStamp) { > > } > > public void nextValidId(int orderId) > { > System.out.println("inside nextValidId"); > > try { > perlobj.InvokeMethod("nextValidId", new Object [] {"hi"}) ; > } > catch (InlineJavaPerlException pe){ } > catch (InlineJavaException pe) { pe.printStackTrace() ;} > System.out.println("after"); > > } > > public void contractDetails(ContractDetails contractDetails) > { > > } > > public void bondContractDetails(ContractDetails contractDetails) > { > > } > > public void execDetails(int orderId, Contract contract, > Execution execution) { > > } > > public void error(int id, int errorCode, String errorMsg) > { > > } > > public void updateMktDepth(int tickerId, int position, int operation, > int side, double price, int size) > { > > } > > public void updateMktDepthL2(int tickerId, int position, > String marketMaker, int operation, int side, > double price, int size) > { > > } > > public void updateNewsBulletin(int msgId, int msgType, String message, > String origExchange) > { > > } > > public void managedAccounts(String accountsList) > { > > } > > public void receiveFA(int faDataType, String xml) > { > > } > > public void historicalData(int reqId, String date, double open, > double high, double low, double close, > int volume, double WAP, boolean hasGaps) > { > > } > > public void scannerParameters(String xml) { > > } > > public void scannerData(int reqId, int rank, > ContractDetails contractDetails, String distance, > String benchmark, String projection) { > > } > } > -- ===================== Patrick LeBoutillier Laval, Québec, Canada