using std::cout;
using std::endl;
#include
int main()
double Simulation_Status;
{
if (Simulation_Status == 0) // load parameters
{
double PacketArrivalTime = 0.0;
double MeanPacketLength = 0.0;
int BufferSize = 0;
double LineSpeed = 0.0;
double SimulationTime = 0.0;
double TimeStamp = 0.0;
PoissonArrival TrafficModel;
int channel_state = 0;
long total_data_packets = 0;
long total_departed_pakcets = 0;
double total_packet_system_time = 0.0;
double total_packet_queueing_time = 0.0;
long number_of_packet_queued = 0;
long number_of_blocked_data = 0;
double channel_time = 0.0;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime);
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.event = new_packet_arrival; Q.data_type = DATA;
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_head(Q);
button1->Text = "Running...";
Simulation_Status = 1;
button1->Enabled = false;
textBox5->AcceptsReturn = true;
textBox5->AppendText("Simulation starts at " + DateTime::Now.ToLongTimeString() + "\n");
while (TimeStamp<1000)
{
Schedular.get_event(Q);
if (Schedular.seq_no > 200000000)
Schedular.seq_no = 0;
switch(Q.event)
{
case new_packet_arrival:
if (TimeStamp > Q.Scheduled_Time)
textBox5->AppendText("error410\n");
else
{
TimeStamp = Q.Scheduled_Time;
if (channel_state == 0)
{
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp; ++channel_state;
Schedular.join_from_end(Q);
textBox5->AppendText(Q.seq_no + " enters server \n");
}
else if (DataBuffer.count < BufferSize)
{
Q.event = queued;
DataBuffer.join_from_end(Q);
textBox5->AppendText(Q.seq_no + " enters queue \n");
}
else
{
textBox5->AppendText(Q.seq_no + " blocked! \n");
}
Q.data_type = DATA;
Q.event = new_packet_arrival;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime) + TimeStamp; Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_end(Q);
}
break;
case departure:
if (TimeStamp > Q.Scheduled_Time)
textBox5->AppendText("error447\n");
else
{
TimeStamp = Q.Scheduled_Time;
--channel_state;
if (Q.data_type == DATA)
{
}
if (DataBuffer.count != 0)
{
DataBuffer.get_event(Q);
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp; ++channel_state;
Schedular.join_from_end(Q);
total_packet_queueing_time += (TimeStamp - Q.Create_Time);
}
}
break;
}
}
textBox5->AppendText("Simulation ends at " + DateTime::Now.ToLongTimeString() + "\n");
button1->Text = "Finished"; Simulation_Status = 0;
double packet_loss_rate = double(number_of_blocked_data) / double(total_data_packets);
double average_delay = total_packet_system_time / double(total_departed_pakcets);
double average_queueing_delay = total_packet_queueing_time / double(total_departed_pakcets);
double average_queueing_delay2 = total_packet_queueing_time / double(number_of_packet_queued);
textBox5->AppendText("封包遺失率 = " + Convert::ToString(packet_loss_rate) + "\n"); textBox5->AppendText("平均延遲時間 = " + Convert::ToString(average_delay) + " sec.\n");
textBox5->AppendText("平均排程時間 = " + Convert::ToString(average_queueing_delay) + " sec.\n");
textBox5->AppendText("平均排程時間 if queued = " + Convert::ToString(average_queueing_delay2) + " sec.\n");
}
}
{
Simulation_Status = 0;
}
沒有留言:
張貼留言