0

複数のマシンとシリアルに通信するコードを書いています。各マシンはコミュニケーター クラスのインスタンスと対話し、そのクラスにはシリアル ポート イベント リスナーがあります。

マシンが十分なデータを受け取ると、2 次のテストが実行されます。(テスト自体が二次であるため仕方がありません)、入力が大きくなる可能性があります。その結果、コードが計算を行っている場合、一部のシリアル イベントが登録されないのではないかと心配しています。

解決策として、計算を実行するスレッドを作成し、接続されているマシンの数によって決定される時間、ループ中にスリープするように設定することを検討しました。しかし、そのスレッドをserialeventメソッドからスリープ状態にできれば、もっと良い考えになるのではないかと思いましたか? これは可能ですか、それとも実行中のメソッドが終了するまでスレッドは実行されませんか?

以下のコードでは、Calculations メソッド内に Thread.sleep を含めました。これは、シリアルイベントがスレッドを中断できない場合に実行する予定だったものです。

private class CalculationThread implements Runnable{
@Override
  public void run() 
    {
          calculateResult();
    }
}}

private void calculateResult() {
    ArrayList<Double> theoretical_vals;
    ArrayList<ArrayList<Double>> theoretical_curves = new ArrayList();
    double current_maxdiff, maxdiff;
    double ao = measurements.get(0).getMeasurement();
    theoretical_vals = RadioCalculations.theoreticalVals(measurements, hf, ao);
    theoretical_curves.add(theoretical_vals);
    int index = 1;
    for (MeasurePoint m : measurements) {
        theoretical_vals = RadioCalculations.calibratecontrolValues(measurements, index, hf);
        try {
            Thread.sleep(20*(parent.getNumberOfTests()-1));} 
        catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        theoretical_curves.add(theoretical_vals);
        index++;
    }
    index = 1;
    maxdiff = 0;
    for (ArrayList a : theoretical_curves) {
        try {
            Thread.sleep(20*(parent.getNumberOfTests()-1));
        } catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        current_maxdiff = compareValues(a, measurements);
        if (current_maxdiff > maxdiff) {
            if (current_maxdiff > pass_limit) {
                passed = false;
                failed_measurementpoint = index;
                break;
            }
            maxdiff = current_maxdiff;
            index++;
        }

    }
    passed = true;
    max_dev = maxdiff;
    logResults();
}




public void serialEvent(SerialPortEvent spe) {
    try {
        Thread.sleep(10);
    } catch (InterruptedException ex) {
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }
   pauseListen(false);     
   if (spe.getEventType()== SerialPortEvent.DATA_AVAILABLE){   

         try {
    while (inputStream.available() > 0) {
                   numBytes =  inputStream.read(readBuffer);}} 
        catch (IOException e) {e.printStackTrace();}
        input_line= new String(readBuffer,0,numBytes);
        input_line = input_line.replaceAll("[\n\r]","*");
        buffer.append(input_line);
        if (input_line.contains("*")){   
        input_line= buffer.toString();
        input_line = input_line.replaceAll("[*]","");
        buffer.setLength(0);
        pauseListen(true);
        update(input_line);}}
}
} 
4

1 に答える 1