Формы Windows - запуск второго цикла сообщений в одном потоке не является допустимой операцией - PullRequest
0 голосов
/ 22 января 2019

Я видел и пробовал текущие сообщения других людей, но решения не исправляют это. Код в программе запускает форму, чтобы получить входные данные, чтобы решить, куда идти в программе. Поэтому, если они выберут первую опцию, она вернет 0 программе. Код в основной программе:

   static void Main()
    {          
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new mainMenu());
    }
    public static void OptionSelect(int optionSelected)
    {            
        switch (optionSelected)
        {
            case 0:
                ReadJobs();
                break;
            case 1:
                AddJobs();
                UpdateTable(connectionString);
                ReadJobs();
                break;
            case 2:
                MessageBox.Show("Option not available yet");
                break;
        }
    }
    public static void AddJobs()
    {
        Application.Run(new AddJob());
    }
    public static void ReadJobs()
    {            
        Application.Run(new TableOutput());            
    }

И программа в первой форме:

public partial class AddJob : Form
{
    private int count = 0;
    public AddJob()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox2_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox3_TextChanged(object sender, EventArgs e)
    {
        if (textBox3.Text == null)
        {
            MessageBox.Show("Please enter valid data");
        }
        else
        {
            Program.Client = textBox3.Text;
        }

    }

    private void textBox7_TextChanged(object sender, EventArgs e)
    {
        if (textBox7.Text == null)
        {
            Program.Description = "N/A";
        }
        else
        {
            Program.Description = textBox7.Text;
        }
    }

    private void textBox5_TextChanged(object sender, EventArgs e)
    {            
        //Program.Cost = float.Parse(textBox5.Text);
        bool fail = false;
        fail = float.TryParse(textBox5.Text, out Program.Cost);
        if ((!fail) && (count % 2 == 0)) 
        {
            count++;
            MessageBox.Show("Please enter valid data");
            textBox5.Clear();               
        }
        count = 0;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Close();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Environment.Exit(1);
    }
}

и код для второй формы:

public partial class mainMenu : Form
{
    public mainMenu()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Application.Exit();
        Program.OptionSelect(0);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Close();
        Program.OptionSelect(1);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        Close();
        Program.OptionSelect(2);
    }
}

Программа запускает первую форму нормально, а затем вылетает на второй, и это происходит с каждой формой.

1 Ответ

0 голосов
/ 22 января 2019

Вы определенно не должны этого делать. То, что вы делаете, это создаете своего рода гоночное состояние между двумя циклами сообщений. Цикл сообщений выглядит упрощенно так:

while (Message msg = GetMessage(…))
{
    TranslateMessage (msg);
    DispatchMessage (msg); //send the message to the window procedure 
} 

GetMessage блокируется до тех пор, пока в очереди не появится сообщение. Итак, если вы дважды вызываете GetMessage, вы не знаете, какое окно будет обрабатывать какое сообщение. Ваша программа будет вести себя непредсказуемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...