2013-11-17 1 views
0

Мне не разрешено использовать потоки только для очереди.C# Формы Количество очередей нажатий на кнопки для выполнения после завершения первого этапа

В рамках нашего школьного проекта мы должны реализовать рабочую анимацию, которая представляет собой лифт. Я выполнил всю логику и анимацию за ней (перемещение вверх и вниз, открытие дверей и т. Д.), Которое контролируется событиями button_click. например: button1- перемещения лифта вверх button2- двигаться на лифте вниз button3- открытой двери лифта button4- открыты двери напольные

Моя проблема у меня: когда я нажимаю button1, лифт будет двигаться вверх, однако, если я нажму кнопку2 до того, как кнопка 1 закончит обработку события, мой код сломается, и все ад сломается.)), что я хотел бы сделать, это иметь такую ​​логику, как это:

-button1 нажата и добавлено в очередь, -button2 нажимается до того, как кнопка 1 закончена, поэтому она добавляется в верхнюю часть очереди и ждет, пока кнопка 1 перестанет обрабатываться, а затем ru ns событие button2

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

Было бы очень признательно, если бы кто-нибудь мог объяснить пример того, как это сделать, где его реализовать (где действительно запустить этот код) или указать мне хорошую ссылку на него.

+0

Google «Дизайн дизайна команды», я думаю, что он в значительной степени подходит к тому, что вам нужно делать. –

+0

похоже, что это не для новичков в C#? –

+0

Вы случайно используете 'Application.DoEvents();'? ... –

ответ

0

В C# имеется коллекция Queue.

MSDN

public class ElevatorAction 
{ 
    public string Action { get; set; } 

    public void Act() 
    { 
     throw new NotImplementedException(); 
    } 
} 

// Create two actions (up and down) 
ElevatorAction upAction = new ElevatorAction{ Action = "Up" }; 
ElevatorAction downAction = new ElevatorAction{ Action = "Down" }; 

// Create the Queue 
Queue<ElevatorAction> elevatorActionQueue = new Queue<ElevatorAction>(); 

// Add the actions from your button click events. 
elevatorActionQueue.Enqueue(upAction); // call from button 1 click 
elevatorActionQueue.Enqueue(downAction); // call from button 2 click 

// Loop through the queue to perform the queued actions 
ElevatorAction currentAction = new ElevatorAction(); 
while(elevatorActionQueue.Count > 0) 
{ 
    currentAction = elevatorActionQueue.Dequeue(); 
    currentAction.Act(); 
} 
+0

Im пробуя это на новой пустой форме, но когда я объявляю ElevatorAction upAction = new ElevatorAction {Action = "Up"}; это дает мне ошибку: ... это поле, но используется как тип. Что я делаю не так? – Dom

+0

ElevatorAction - это класс. Сначала вам нужно объявить класс. Я обновил свой ответ, чтобы включить скелет. –

0

Настройка очереди и таймер. Затем вы можете использовать очередь для загрузки текста кнопки в очередь во время события button_click. Таймер периодически срабатывает, а для примера - Deques Look на CSharp Queue и Windows From Timer.

class Form1 : Form 
{ 
    Queue<string> ButtonQueue = new Queue<string>(); 
    System.Windows.Forms.Timer theTimer = new System.Windows.Forms.Timer(); 
    public Form1() 
    { 
     InitializeComponent(); 
     buttonQueue = new Queue(); 
     theTimer.Tick += new EventHandler(theTimer_Tick); 
    } 
    private void button_Click(object sender, EventArgs e) 
    { 
     if (sender.GetType().Name.Equals("Button")) 
     { 
      buttonQueue.Enqueue(((Button)sender).Text); 
     } 
    } 
    void theTimer_Tick(object sender, EventArgs e) 
    { 
     theTimer.Enabled = false; 

     switch (ButtonQueue.Dequeue().ToUpper()) 
     { 
      case "UP": 
       //Run animation include Application.DoEvents() in the animation loop to prevent GUI lockup 
       break; 
      case "DOWN": 
       //Run animation include Application.DoEvents() in the animation loop to prevent GUI lockup 
       break; 
      case "OPEN": 
       //Run animation include Application.DoEvents() in the animation loop to prevent GUI lockup 
       break; 
     } 
     theTimer.Enabled = true; 
    } } 
+0

Почему вы используете ButtonQueue и buttonQueue? я запутался там, пожалуйста, объясните? Кроме того, вы могли бы объяснить, что вы имели в виду с // Run анимацией include Application.DoEvents(). Извините за вопрос новичка – Dom

+0

Я пробовал это и реализовал для соответствия моему коду, однако мои события button_click все еще накладываются друг на друга, в основном события не ждут предыдущего, но сразу начинают выполняться. – Dom