2013-02-24 2 views
0

Мне нужно использовать резьбу для приостановки/возобновления движения снаряда. На button3_Click случае движение снаряда рисуется на экране:Запуск и приостановка потоков?

public void button3_Click(object sender, EventArgs e) 
{ 
//... Lots of drawingcode... 
} 

Мне нужно, чтобы приостановить/возобновить движение снаряда с использованием той же button3_Click, но я новичок в многопоточности и не могу понять, каким образом.

Я попытался:

 public partial class Simulation : Form 
{ 
      Thread parallel1; 
      Thread parallel2; 

      public Simulation() 
      { 
       InitializeComponent(); 
       parallel1 = new Thread(new ThreadStart(button3_Click)); 
      } 
} 

Но я получаю сообщение об ошибке ...

No overload for 'button3_Click' matches delegate 'System.Threading.ThreadStart' 

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

+1

, если у вас есть метод drawingcode названный как 'ничтожной Рисованные() 'и использовать это в ThreadStart, по крайней мере, ошибка компиляции исчезла ... не забудьте вызвать Start on parallel1 ... но я предполагаю, что ваш следующий бамб будет тем фактом, что вы не можете ссылаться на связанные с UI элементы на не-UI-потоке. – rene

+0

Ответ кажется, что я не могу этого сделать, потому что, как вы сказали, есть только один поток пользовательского интерфейса. Позор действительно. – user1920206

+1

@ user1920206 ну, вы всегда можете использовать 'Invoke' для возврата обратно в поток пользовательского интерфейса. Но если вы просто пытаетесь что-то оживить, разве вам не лучше с таймером? – bas

ответ

1

Thats о методе подпись. В C# методы уникальны с их параметрами и именами. Таким образом, эта ошибка говорит вам, что нет способа вызова без какого-либо параметра. Вы можете использовать

new Thread(new ParameterizedThreadStart(... 

Вы можете отправить свои параметры. Обычно отправитель является вашей кнопкой, и вы можете отправить «новый EventArgs()» для параметра EventArgs.

Но лучший способ (я использую его) не писать сложный код при нажатии кнопки. Напишите свой сложный код другим способом и вызовите его под кнопкой. Обычно операции используются не один раз, поэтому вы можете вызывать свой метод везде, без каких-либо изменений. Напишите новый способ, чтобы сделать вашу операцию. Если вам нужен какой-либо параметр в вашем методе, вы можете вызвать его с параметризованнымThreadStart. И заметьте: если вы получаете какие-либо ошибки, как это больше одного или доступа потока объекта вы можете установить это свойство перед вашей нитью начать

CheckForIllegalThreadStart=false;

+0

Что такое CheckForIllegalThreadStart? – usr

+0

А я вижу, вы имеете в виду checkforillegalcrossthreadcalls. Считаете ли вы, что это безопасно? Почему существует ошибка, если вы можете просто отключить ее? Вы не подозреваете о таком решении? (Это очень опасно: http: // stackoverflow.ком/вопросы/2587930/ответвления-оф-checkforillegalcrossthreadcalls-ложного). Не делай этого. – usr

Смежные вопросы