在方法完成之前循环如何继续?
How can loop continue before method is finished?
我的程序中有多个线程(可运行)。主题之一是处理 RS232 通信。
我的问题是循环内的代码没有按照写入的顺序执行:
while(!serialData.dataToSend.isEmpty())
{
try {
SerialMsgToSend msgObject = serialData.dataToSend.remove();
if(msgObject.type == msgObject.HOLDING_REGISTER)
{
Thread.sleep(COMMAND_WAIT_TIME);
Toolkit.getDefaultToolkit().beep();
modBusManager.singleRegisterWriteToMultipleRegisters(msgObject.unit, msgObject.startRegisterAdress, msgObject.data);
}
else if(msgObject.type == msgObject.COIL)
{
Thread.sleep(COMMAND_WAIT_TIME);
Toolkit.getDefaultToolkit().beep();
modBusManager.writeToCoil(msgObject.unit, msgObject.startRegisterAdress, msgObject.data[0] == 1);
}
Thread.sleep(5000);
readUnitsData(msgObject.unit);
Thread.sleep(5000);
if(msgObject.RESPONSE > 0)
{
serialData.listeners[msgObject.unit - 1].sendResponseToServer(msgObject.RESPONSE);
}
} catch (Exception ex) {
log.error("Exception on sending data: " + ex.toString());
}
}
首先我通过调用写入 ModBus 寄存器:
modBusManager.singleRegisterWriteToMultipleRegisters(msgObject.unit, msgObject.startRegisterAdress, msgObject.data);
之后我想等待 5 秒寄存器更新,然后读取它们并将信息发送到服务器。
我用调用方法读取数据:
readUnitsData(msgObject.unit);
然后我使用侦听器告诉另一个线程将数据发送到服务器:
serialData.listeners[msgObject.unit - 1].sendResponseToServer(msgObject.RESPONSE);
我的问题是数据在得到 read/updated 之前被发送到服务器,所以我发送旧数据。我习惯于按照编写的顺序执行代码。我是不是以错误的方式使用线程或者可能是什么问题?
这是我调用读取数据的方法:
private void readUnitsData(int unitID)
{
if(mtxData.climatList[unitID] != null)
{
try
{
log.info("Serial reading data for: " + unitID);
int[] coils = modBusManager.readCoils(unitID + 1,0,87);
String[] holding = modBusManager.readHoldingRegisters(unitID + 1,0,64); //(int slaveAdress, int registerAdress, int registerQuntaity)
if(coils != null && holding != null)
{
System.out.println("send to listner: " + unitID);
serialData.listeners[unitID].newHoldingAndCoilData(holding, coils);
}
} catch (Exception ex)
{
log.error("Exception on run: " + ex.toString());
}
}
}
以及连接到侦听器的其他可运行对象中的方法:
@Override
public void sendResponseToServer(int responseType)
{
try
{
log.info("listener for sendStatusToServer called: " + responseType);
Thread.sleep(15000);
switch(responseType)
{
case 1:
communicationManager.sendStatus();
break;
case 2:
communicationManager.sendSettings();
break;
}
}catch(Exception ex)
{
log.error("Exception on sendResponseToServer: " + ex);
}
}
我确实喜欢@Markus Mitterauer 提出的建议并拆解了代码。我发现这是错误的 unitID 之一的问题。因此,我在读取寄存器时没有得到任何值,并且没有正确触发侦听器。
我的程序中有多个线程(可运行)。主题之一是处理 RS232 通信。 我的问题是循环内的代码没有按照写入的顺序执行:
while(!serialData.dataToSend.isEmpty())
{
try {
SerialMsgToSend msgObject = serialData.dataToSend.remove();
if(msgObject.type == msgObject.HOLDING_REGISTER)
{
Thread.sleep(COMMAND_WAIT_TIME);
Toolkit.getDefaultToolkit().beep();
modBusManager.singleRegisterWriteToMultipleRegisters(msgObject.unit, msgObject.startRegisterAdress, msgObject.data);
}
else if(msgObject.type == msgObject.COIL)
{
Thread.sleep(COMMAND_WAIT_TIME);
Toolkit.getDefaultToolkit().beep();
modBusManager.writeToCoil(msgObject.unit, msgObject.startRegisterAdress, msgObject.data[0] == 1);
}
Thread.sleep(5000);
readUnitsData(msgObject.unit);
Thread.sleep(5000);
if(msgObject.RESPONSE > 0)
{
serialData.listeners[msgObject.unit - 1].sendResponseToServer(msgObject.RESPONSE);
}
} catch (Exception ex) {
log.error("Exception on sending data: " + ex.toString());
}
}
首先我通过调用写入 ModBus 寄存器:
modBusManager.singleRegisterWriteToMultipleRegisters(msgObject.unit, msgObject.startRegisterAdress, msgObject.data);
之后我想等待 5 秒寄存器更新,然后读取它们并将信息发送到服务器。
我用调用方法读取数据:
readUnitsData(msgObject.unit);
然后我使用侦听器告诉另一个线程将数据发送到服务器:
serialData.listeners[msgObject.unit - 1].sendResponseToServer(msgObject.RESPONSE);
我的问题是数据在得到 read/updated 之前被发送到服务器,所以我发送旧数据。我习惯于按照编写的顺序执行代码。我是不是以错误的方式使用线程或者可能是什么问题?
这是我调用读取数据的方法:
private void readUnitsData(int unitID)
{
if(mtxData.climatList[unitID] != null)
{
try
{
log.info("Serial reading data for: " + unitID);
int[] coils = modBusManager.readCoils(unitID + 1,0,87);
String[] holding = modBusManager.readHoldingRegisters(unitID + 1,0,64); //(int slaveAdress, int registerAdress, int registerQuntaity)
if(coils != null && holding != null)
{
System.out.println("send to listner: " + unitID);
serialData.listeners[unitID].newHoldingAndCoilData(holding, coils);
}
} catch (Exception ex)
{
log.error("Exception on run: " + ex.toString());
}
}
}
以及连接到侦听器的其他可运行对象中的方法:
@Override
public void sendResponseToServer(int responseType)
{
try
{
log.info("listener for sendStatusToServer called: " + responseType);
Thread.sleep(15000);
switch(responseType)
{
case 1:
communicationManager.sendStatus();
break;
case 2:
communicationManager.sendSettings();
break;
}
}catch(Exception ex)
{
log.error("Exception on sendResponseToServer: " + ex);
}
}
我确实喜欢@Markus Mitterauer 提出的建议并拆解了代码。我发现这是错误的 unitID 之一的问题。因此,我在读取寄存器时没有得到任何值,并且没有正确触发侦听器。