Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 24
1
.NET 4.x

Как заставить работать потоки одновременно

04.06.2016, 14:42. Просмотров 639. Ответов 1
Метки нет (Все метки)


Привет,Я запускаю два потока пуля и самолет но они работают в таком порядке сначала пуля летит до конца формы,потом уже пролетает самолет.Но мне нужно чтоб пока самолет летит я в него стрелял.Но пока летит пуля,не летит самолет.Короче говоря потоки работаю не одновременно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//код
Plane AirPlane = new Plane(MainGrid);//и тут я создают Самолет и даю указание лететь с лева на право
            if (e.Key == Key.Space)//Когда я нажимаю пробел
            {
               //MainGrid-Куда добавится пуля, imgTrunk.Margin.Left-парметр чтоб узнать где создать пулю, imgTrunk.Margin.Top--тоже параметр,Rotate--налон(не важно)
                Bullet B = new Bullet(MainGrid, imgTrunk.Margin.Left, imgTrunk.Margin.Top,Rotate);
                B.CreateBullet();//Создание и вылет пули из ствола
            }
 
//Класс пули
class Bullet
{
    Grid Grid;
    double Left;
    double Top;
    int TrunkAngle;
    public Bullet(Grid grid, double Left, double Top, int TrunkAngle)//Запонимаем ссылкы на объекты
    {
        Grid = grid;
        this.Left = Left;
        this.Top = Top;
        this.TrunkAngle = TrunkAngle;
        System.Threading.Thread Gun = new System.Threading.Thread(CreateBullet);//запускаем в новом потоке создание изображение пули и ее анимация
        Gun.Start();
    }
    public void CreateBullet()
    {
        Grid.Dispatcher.Invoke(new Action(delegate//Чтоб из 2 потока получить доступ к основной форме
        {
            Image IBullet = new Image()//создаем само изображение
            IBullet.HorizontalAlignment = HorizontalAlignment.Left;
            IBullet.Height = 29;//29
            IBullet.Margin = new Thickness(Left + 16, Top - IBullet.Height - 5, 0, 0);
            IBullet.VerticalAlignment = VerticalAlignment.Top;
            IBullet.Width = 8;//8
            IBullet.Source = new BitmapImage(new Uri(@"E:\Project\C#\[Visual Studio]\[Project]\Универ практика\[8]AirCraft\[8]AirCraft\bin\Debug\Bullet.png"));
            IBullet.RenderTransformOrigin = new Point(3, 3);
            IBullet.RenderTransform = new RotateTransform(TrunkAngle);
            Grid.Children.Add(IBullet);//Добавляем изображение на фомру
            //-------------
            PShot(IBullet);//Запускаем анимацию формы
            //---------------
        }),DispatcherPriority.Background);
    }
    public void PShot(Image IBullet)//
    {
        Grid.Dispatcher.Invoke(new Action(delegate//Чтоб из 2 потока получить доступ к основной форме
        {
            for (int i = 0; i < IBullet.Margin.Top; i++)
            {
                IBullet.Margin = new Thickness(IBullet.Margin.Left, IBullet.Margin.Top - 1, 0, 0);//поднимаем картинку пули на 1 пиксель вверх
                System.Windows.Forms.Application.DoEvents();//Это вообще из WinForm,но без нее анимация не работает.Обязует выполнить 
                System.Threading.Thread.Sleep(3);//Задерка
            }
        }),DispatcherPriority.Background);
        Grid.Children.Remove(IBullet);//как пуля достигла вехра формы,она удаляется
    }
 
}
 
//Класс самолета
class Plane
{
    Grid Grid;
    public Plane(Grid grid)
    {
        Grid = grid;
        System.Threading.Thread th = new System.Threading.Thread(CreatePlane);//ЗАпускаем поток
        th.Start();
        //Task t = new Task(CreatePlane);
       // t.Start();
    }
    public void CreatePlane()
    {
        Grid.Dispatcher.Invoke(new Action(delegate
        {
            Image Planel = new Image();
            Planel.HorizontalAlignment = HorizontalAlignment.Left;
            Planel.Height = 40;
            Planel.Margin = new Thickness(-160, 26, 0, 0);
            Planel.VerticalAlignment = VerticalAlignment.Top;
            Planel.Width = 160;
            Planel.Source = new BitmapImage(new Uri(@"E:\Project\C#\[Visual Studio]\[Project]\Универ практика\[8]AirCraft\[8]AirCraft\bin\Debug\PlaneR.png"));
            Grid.Children.Add(Planel);//добавляем самолет на форму
            Go(Planel);//Анимирует его
        }), DispatcherPriority.Background);
    }
    public void Go(Image Planel)
    {
        Grid.Dispatcher.Invoke(new Action(delegate
        {
            for (int i = 0; i < Grid.ActualWidth+160; i++)
            {
                Planel.Margin = new Thickness(Planel.Margin.Left+1, Planel.Margin.Top, 0, 0);//движется с лева на право
                System.Windows.Forms.Application.DoEvents();
                System.Threading.Thread.Sleep(2);
            }
        }),DispatcherPriority.Background);
        Grid.Children.Remove(Planel);//как пролетает удаляется
    }
}
Если кто-то захочет взглянуть на проект [8]AirCraft.zip
Я попробовал кучу способ но ниче не получилось,поэтому пишу сдеть. на ренешение мне дали 1-2 дня поэтому нет много времени читать литературу.
Если кто знает в чем дело прошу помочь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2016, 14:42
Ответы с готовыми решениями:

Мультипоточность, заставить работать большое кол-во потоков одновременно
Всем привет! Продолжаю свою прошлую тему - https://www.cyberforum.ru/csharp-net/thread826867.html....

Как одновременно воспроизвести аудио-потоки от разных участников чата?
Пишу аудио-чат конференцию. Передаю аудио-поток с микрофона клиента на сервер, с сервера...

Как заставить Socket работать и с IPv4, и с IPv6?
Доброе время суток! Подскажите, как заставить Socket работать с обеими вариантами IP одновременно?...

Разные проекты в одном solution - как заставить работать?
Есть основной проект - Windows Application(C#) и ещё один - Console Application(C). Нужно...

1
11 / 26 / 12
Регистрация: 20.09.2013
Сообщений: 594
04.06.2016, 15:21 2
Воспользуйся потоками.
Делаешь первый поток который из программы вызываешь например в нем будет пуля лететь, и в этом потоке первой строчкой запускаешь второй поток в котором самолет! Но я точно не помню может быть так что это не прокатит, потому что не помню возможен ли из потока вызов второго потока! Если не получиться, то должно прокатить и просто вызов в программе первого потока и сразу за ним вызов второго потока.
Для использования потоков подключай:
C#
1
using System.Threading;
Сам поток пиши так:
C#
1
2
public static void Название потока()
{ список всего что нужно}
Вызов потока:
C#
1
2
Thread thr = new Thread(new ThreadStart(Название потока));
thr.Start();
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2016, 15:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как заставить чат работать через Интернет, а не только в локальной сети
Вот есть чатик но он работает только по Локальной сети вот код: static void Main() {...

Потоки, одновременно 5 задач
Уже 2 тема пошла, но от той я куча информации почитал, но так и не понял, как мне реализовать такой...

Пул потоков и потоки одновременно
Мне интересно безопасно ли использовать пул потоков и обыкновенные потоки одновременно? Например,...

Как заставить работать новое приложение на виндовс 7 если база sql написана для 8,10 винды?
Добрый день, нужна ваша помощь, есть приложение вин формс которое соединяется с БД sql, версия...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.