I wrote the program, after pressing the Start button, the program just hangs and that's it. There are no mistakes. Help fix the problem. I think the reason lies in this line Precision = Convert.ToDouble(comboBoxPrecision.SelectedItem.ToString(), NumberFormatInfo.InvariantInfo); It converts the value of 0.01 to Double

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Globalization; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class WorkForm : Form { private int InOrders; private int ServiceOrders; private int NumOfChannels; private double Precision = 0; private double OrderInterval; private double ChannelInterval; private int TotalTime; private double CmoTime; private ulong NumOfOrders = 0; private ulong ServedOrders; private int CmoPosition; private int[] ChannelBusy; private double[] ServiceTimeOfChannel; private Random rand = new Random(); // функция которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ для дальнСйшСго использования Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈ функциях private int Precition(double e) { int Tochnost = 0; if (e == 0.1) Tochnost = 10; if (e == 0.01) Tochnost = 100; if (e == 0.001) Tochnost = 1000; return Tochnost; } // Число Π·Π½Π°ΠΊΠΎΠ² для округлСния исходя ΠΈΠ· точности private int ChisloZnakov(double Prec) { int a = 0; if (Prec == 0.1) a = 1; if (Prec == 0.01) a = 2; if (Prec == 0.001) a = 3; return a; } // функция которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ заявками, Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€. Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ обслуТ. ΠΊΠ°Π½Π°Π»Π° private double OrdersInterval(int NumOfOrders, double Tochnost) { int CelayaChast; double Ostatok; CelayaChast = Precition(Tochnost) / NumOfOrders; Ostatok = (Precition(Tochnost) / (double)NumOfOrders - CelayaChast) * 10; if (Ostatok >= 5) CelayaChast++; return (double)(CelayaChast / (double)Precition(Tochnost)); } // Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ private double TimeGenerator(bool FirstOrder, double Interval, double Tochnost) { double NewTime; int GenerationInterval = (int)(Interval * Precition(Tochnost) + 1); // Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли это Π½Π΅ пСрвая заявка if (!FirstOrder) { // ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ нуля => ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π΅ΡΡ врСмя do { NewTime = (double)(rand.Next() % GenerationInterval) / Precition(Tochnost); } while (NewTime == 0); } else NewTime = (double)(rand.Next() % GenerationInterval) / Precition(Tochnost); return Math.Round(NewTime, ChisloZnakov(Tochnost)); } // провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ заявки private bool NewOrder(double TimeOfCmo, double IntervalOfOrder, ulong NumberOfOrders) { if (TimeOfCmo >= IntervalOfOrder * (NumberOfOrders)) { return true; } else return false; } // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° систСмы Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ private void CmoCheck(int TotalTime, double CmoTime, int NumOfChannels) { int i = 0; if (CmoPosition != 0) { while (i < NumOfChannels) { if (ChannelBusy[i] == 1) { if (((ServiceTimeOfChannel[i] <= CmoTime) && (CmoTime <= TotalTime)) || ((CmoTime > TotalTime) && (ServiceTimeOfChannel[i] <= TotalTime))) { ChannelBusy[i] = 0; ServiceTimeOfChannel[i] = 0; CmoPosition--; richTextBox1.Text += (i + 1).ToString() + "-ΠΉ ΠΊΠ°Π½Π°Π» обслуТил заявку" + "\n"; ServedOrders++; } } i++; } } } // запись заявок Π² ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈ гСнСрация Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ обслуТивания Π² ΠΊΠ°Π½Π°Π»Π΅ + ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ обслуТивания private void CmoWork(double CmoTime, int NumOfChannels, double ChannelInterval, double e) { double ChannelWorkTime; int i = 0; // Ссли систСма свободна, Ρ‚ΠΎ запись осущСствляСтся Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» if (CmoPosition == 0) { ChannelBusy[0] = 1; ChannelWorkTime = TimeGenerator(false, ChannelInterval, e); ServiceTimeOfChannel[0] = CmoTime + ChannelWorkTime; CmoPosition++; InfoOrder(CmoTime, 0, ChannelWorkTime); } else // ΠΈΠ½Π°Ρ‡Π΅, ΠΈΠ΄Π΅Ρ‚ запись Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ свободный ΠΊΠ°Π½Π°Π» { if (CmoPosition != NumOfChannels) { while (i < NumOfChannels) { if (ChannelBusy[i] == 0) { ChannelBusy[i] = 1; ChannelWorkTime = TimeGenerator(false, ChannelInterval, e); ServiceTimeOfChannel[i] = CmoTime + ChannelWorkTime; CmoPosition++; InfoOrder(CmoTime, i, ChannelWorkTime); break; } i++; } } else { richTextBox1.Text += "Заявка Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ принята Π½Π° обслуТиваниС - ΠšΠΠΠΠ›Π« ЗАНЯВЫ" + "\n"; richTextBox1.Text += "БостояниС БМО: " + CmoPosition.ToString() + "\n"; for (i = 0; i < NumOfChannels; i++) { richTextBox1.Text += "БостояниС " + (i + 1).ToString() + "-Π³ΠΎ ΠΊΠ°Π½Π°Π»Π° : " + Convert.ToString(ChannelBusy[i]) + "\n"; richTextBox1.Text += "ВрСмя окончания обслуТивания Π² " + (i + 1).ToString() + " ΠΊΠ°Π½Π°Π»Π΅: " + Convert.ToString(ServiceTimeOfChannel[i]) + "\n"; } } } } // информация ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅ΠΉ заявкС private void Info(double CmoTime, ulong NumOfOrders) { richTextBox1.Text += "ВрСмя поступлСния " + NumOfOrders.ToString() + "-ΠΉ заявки: " + CmoTime.ToString() + "\n"; } private void InfoOrder(double CmoTime, int Index, double TimeOfChannel) { richTextBox1.Text += "Заявка принята Π½Π° обслуТиваниС: " + CmoTime.ToString() + " Π² " + (Index + 1).ToString() + "-ΠΉ ΠΊΠ°Π½Π°Π»" + "\n"; richTextBox1.Text += "ВрСмя обслуТивания заявки Π² ΠΊΠ°Π½Π°Π»Π΅: " + TimeOfChannel.ToString() + "\n"; richTextBox1.Text += "ВрСмя окончания обслуТивания: " + ServiceTimeOfChannel[Index].ToString() + "\n"; } // конструктор Ρ„ΠΎΡ€ΠΌΡ‹ public WorkForm() { InitializeComponent(); } private void btnExit_Click_1(object sender, EventArgs e) { Application.Exit(); } // ПУБК private void btnStart_Click_1(object sender, EventArgs e) { // Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… if (TBoxOrders.Text != "" && TBoxOrderService.Text != "" && TBoxChannels.Text != "" && comboBoxPrecision.Text != "" && TBoxCmoWork.Text != "") { this.Enabled = false; InOrders = Convert.ToInt32(TBoxOrders.Text); ServiceOrders = Convert.ToInt32(TBoxOrderService.Text); NumOfChannels = Convert.ToInt32(TBoxChannels.Text); Precision = Convert.ToDouble(comboBoxPrecision.SelectedItem.ToString(), NumberFormatInfo.InvariantInfo); richTextBox1.Text = ""; int i = 0; // установлСниС размСрности массивов ChannelBusy = new int[NumOfChannels]; ServiceTimeOfChannel = new double[NumOfChannels]; TotalTime = Convert.ToInt32(TBoxCmoWork.Text); // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ систСмы Π² ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС (ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…) CmoTime = 0; CmoPosition = 0; NumOfOrders = 0; ServedOrders = 0; while (i <= NumOfChannels - 1) { ChannelBusy[i] = 0; ServiceTimeOfChannel[i] = 0; i++; } // ГСнСрация поступлСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ заявки CmoTime = TimeGenerator(true, OrderInterval, Precision); richTextBox1.Text += "\n" + "-----------------------" + "\n"; richTextBox1.Text += "Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя БМО :" + CmoTime.ToString(); richTextBox1.Text += "\n" + "-----------------------" + "\n"; NumOfOrders++; Info(CmoTime, NumOfOrders); CmoCheck(TotalTime, CmoTime, NumOfChannels); CmoWork(CmoTime, NumOfChannels, ChannelInterval, Precision); // ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° систСмы do { // ГСнСрация ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ БМО CmoTime = Math.Round((CmoTime + TimeGenerator(false, OrderInterval, Precision)), ChisloZnakov(Precision)); richTextBox1.Text += "\n" + "-----------------------" + "\n"; richTextBox1.Text += "Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя БМО :" + CmoTime.ToString(); richTextBox1.Text += "\n" + "-----------------------" + "\n"; // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° систСмы Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ CmoCheck(TotalTime, CmoTime, NumOfChannels); // ПоявлСниС Π½ΠΎΠ²ΠΎΠΉ заявки if ((NewOrder(CmoTime, OrderInterval, NumOfOrders)) && (CmoTime <= TotalTime)) { NumOfOrders++; Info(CmoTime, NumOfOrders); CmoWork(CmoTime, NumOfChannels, ChannelInterval, Precision); } } while (CmoTime < TotalTime); richTextBox1.Text += "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΡ… заявок: " + NumOfOrders.ToString() + "\n"; richTextBox1.Text += "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ обслуТСнных заявок: " + ServedOrders.ToString() + "\n"; this.Enabled = true; this.Focus(); btnResult.Enabled = true; } else MessageBox.Show("ВсС поля ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ для заполнСния!"); } // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ private bool Check(string Txt) { try { Convert.ToInt32(Txt); } catch (Exception) { MessageBox.Show("Π’Π²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌ числом"); return false; } return true; } // Π²Π²ΠΎΠ΄ входящСго ΠΏΠΎΡ‚ΠΎΠΊΠ° private void TBoxOrders_TextChanged_1(object sender, EventArgs e) { TBoxOrderService.Enabled = true; } // Π²Π²ΠΎΠ΄ интСнсивности обслуТивания private void TBoxOrderService_TextChanged_1(object sender, EventArgs e) { TBoxChannels.Enabled = true; } // Π²Π²ΠΎΠ΄ количСства ΠΊΠ°Π½Π°Π»ΠΎΠ² private void TBoxChannels_TextChanged_1(object sender, EventArgs e) { TBoxCmoWork.Enabled = true; } // Π²Ρ‹Π±ΠΎΡ€ точности private void comboBoxPrecision_TextChanged_1(object sender, EventArgs e) { Precision = Convert.ToDouble(comboBoxPrecision.SelectedItem.ToString()); TBoxOrders.Enabled = true; } // Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° входящСго ΠΏΠΎΡ‚ΠΎΠΊΠ° private void TBoxOrders_Leave_1(object sender, EventArgs e) { if (TBoxOrders.Text != "" && (btnExit.ContainsFocus == false)) { if (Check(TBoxOrders.Text)) { InOrders = Convert.ToInt32(TBoxOrders.Text); OrderInterval = OrdersInterval(InOrders, Precision); labelOrdersInterval.Text = OrderInterval.ToString() + " Π΅Π΄.Π²Ρ€."; } else TBoxOrders.Focus(); } } // Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° интСнсивности обслуТивания private void TBoxOrderService_Leave_1(object sender, EventArgs e) { if (TBoxOrderService.Text != "" && (btnExit.ContainsFocus == false)) { if (Check(TBoxOrderService.Text)) { ServiceOrders = Convert.ToInt32(TBoxOrderService.Text); ChannelInterval = OrdersInterval(ServiceOrders, Precision); labelChannelInterval.Text = ChannelInterval.ToString() + " Π΅Π΄.Π²Ρ€."; } else TBoxOrderService.Focus(); } } // Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° количСства ΠΊΠ°Π½Π°Π»ΠΎΠ² private void TBoxChannels_Leave_1(object sender, EventArgs e) { if (TBoxChannels.Text != "" && (btnExit.ContainsFocus == false)) { if (Check(TBoxChannels.Text)) { NumOfChannels = Convert.ToInt32(TBoxChannels.Text); } else TBoxChannels.Focus(); } } // ΠžΠ’Π§Π•Π’ private void btnResult_Click_1(object sender, EventArgs e) { ResultForm FResult = new ResultForm(this, NumOfChannels, Precision, TotalTime, NumOfOrders, ServedOrders); FResult.Show(); } private void WorkForm_Load_1(object sender, EventArgs e) { btnResult.Enabled = false; } private void comboBoxPrecision_SelectedIndexChanged(object sender, EventArgs e) { } } } 
  • 2
    And you did not try to start the program in debug mode and watch how it works? If the program hangs, it means there is some kind of infinite loop in it, in which it is stuck forever. For example, you have a while (CmoTime < TotalTime) but is there any certainty that sometime this condition will break? - AK ♦
  • @AK, debugging swears at the line NewTime = (double) (rand.Next ()% GenerationInterval) / Precition (Tochnost); - Alex
  • @AK, can you help with setting up the program in more detail? - Alex
  • I have not tested it yet, but I am sure that the problem is in the TimeGenerator method. Try to debug the second order and look carefully at GenerationInferval. If GenerationInterval is ever equal to 1 (and this is possible with you), the do while loop will run forever - Philippe
  • @Philippe Checked that generation 1 actually occurs in GenerationInterval. Tell me how to fix it? - Alex

1 answer 1

  private int Precition(double e) { double EPSILON = 0.0001; int Tochnost = 0; if (Math.Abs(e - 0.1) < EPSILON) Tochnost = 10; else if (Math.Abs(e - 0.01) < EPSILON) Tochnost = 100; else if (Math.Abs(e - 0.001) < EPSILON) Tochnost = 1000; else throw new Exception("Not Found Precision: e = " + e.ToString()); return Tochnost; } 

All other places where there is an exact comparison for equality of floating-point numbers (for example, ChisloZnakov ) are also rewritten.

  • Thanks for the help, I'll try to rewrite. Huge respect for help - Alex
  • And why swears on NotFoundException ? - Alex