Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177

Передача переменной или события в поток

03.04.2020, 11:09. Показов 2332. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, у меня есть поток который создан следующим образом
C++
1
2
3
4
 move   = gcnew Thread(gcnew ThreadStart(this,&Form1:: PlavnX));           
         move->Priority=ThreadPriority::Highest;
            move->IsBackground   = true;
 move->Start();
Данный поток выполняет весьма быстрые операции (оперирует микро секундами ) это важный момент потому, потому что я не ошибся и это действительно микро а не мили.
в какой то момент мне необходимо что бы этот поток начал выполнять другие действие.
И так поток создается по событию когда пользователь опустил левую кнопку мыши на кнопку.
Другое событие которое я жду это когда пользователь отожмет клавишу мне нужно выполнить некие другие действия в этом потоке и завершить его
Как мне реализовать передачу bool значения в этот поток ?
Если я делаю так то значение изменяется только в главном потоке (поток который отвечает за обновление формы а в созданном потоке увы нет.
C++
1
2
3
private: System::Void button22_KeyUp(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) {
              MoveXplavn=true;
         }
Как правильно передать это значение в поток ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2020, 11:09
Ответы с готовыми решениями:

Передача переменной из обработчика события
Доброго времени суток! Есть метод, который при возникновения события comboBox1.SelectedIndexChanged записывает выделенный элемент...

Передача значения переменной из события Click
Нужно передать значение переменной из события в другой класс или форму public void Btn_pass_Click(object sender, EventArgs e) ...

Передача значения переменной из события comboBox
Здравствуйте. помогите пожалуйста реализовать передачу данных из события есть событие comboBox private void...

12
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
04.04.2020, 22:46
Цитата Сообщение от Leitto Посмотреть сообщение
Как мне реализовать передачу bool значения в этот поток ?
Зачем его передавать? Объяви, в классе формы, переменную bool, и отслеживай её.
0
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177
05.04.2020, 18:01  [ТС]
nd2, немного не понял. Могли бы привести пример ?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.04.2020, 18:38
Цитата Сообщение от Leitto Посмотреть сообщение
Могли бы привести пример ?
Переделать приложение в многопоточное

Добавлено через 2 минуты
Там есть bool stop, значение которой отслеживается в запущенных потоках, а меняется оно в button3_Click().
1
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177
06.04.2020, 10:52  [ТС]
nd2, Я боюсь что этот метод работает только в C# ибо у меня он не работает
C++
1
2
3
4
5
6
7
8
9
10
    public ref class Form1 : public System::Windows::Forms::Form
    {
     bool MoveXplavn;   
    public:
        Form1(void)
        {
 
            InitializeComponent();          
        }
......
MoveXplavn переменная которая дальше принимает значение false а по событию принимает значение true;
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.04.2020, 11:09
Этот метод везде работает, если правильно делать. Код показывай, как делаешь, чтобы можно было проверить.
0
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177
06.04.2020, 11:45  [ТС]
nd2, Все события обрабатываются но в потоке изменение не происходит
объявление переменной
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
using namespace Emgu::CV::Features2D;
using namespace Emgu::CV::XFeatures2D;
using namespace Emgu::CV::UI;
using namespace Emgu::CV::Util;
using namespace Emgu::CV::Cuda;
    using namespace std;
 
    /// <summary>
    /// Сводка для Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
     bool MoveXplavn;   
    public:
        Form1(void)
        {
 
            InitializeComponent();          
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Form1()
        {       
            if (components)
            {
                delete components;
            }
        }
Нажатие на кнопку
C++
1
2
3
4
5
6
7
8
9
private: System::Void button22_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
             NapX=0; MoveXplavn=false;
                SmoveX=100;
             move   = gcnew Thread(gcnew ThreadStart(this,&Form1:: PlavnX));           
         move->Priority=ThreadPriority::Highest;
            move->IsBackground   = true;
 move->Start();
 
         }
Отпуск кнопки
C++
1
2
3
private: System::Void button22_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
             MoveXplavn=true;
         }
Код выполняемый в потоке
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
void PlavnX (){
    
    int realipx = 0;
 
 
 
             
 
            
              
 
 
            
    LochalAx = Ax;
    LochalVx = Vx;
 
    Simpx = ShagX * (1 / Kdx);
    T0 = sqrt(Simpx / LochalAx);
    LochalTimpx = (Simpx) / LochalVx;
 
 
 
    t = T0;
    T = T0;
    // richTextBox3.Text += "\n " + (T0*1000).ToString() + " номер " + Aximp.ToString();
    Aximp = 1;
    while (T >= LochalTimpx)
    {
        T = T0 / (1 + T0 * (LochalAx / ShagX * Kdx) * t);
        t = t + T;
        // 
 
        if ((T >= LochalTimpx))
        {
 
            Aximp++;
 
        }
    }
    T = T0;
    t = T0;
    LochalAxx = Aximp;
    //  ulong port1 = 0;
    // выставляем в порту  11
    port1 = port1 | 3;
    // udelay((long)((0.00003 * 10000000000)));
    //выставляем вращение вправо
    if (NapX == 1)
    {
        //выставляем вращение вправо
 
        port1 = port1 ^ 2;
        //LPT.Write(adressport1, LPT.Register.DATA, port1);
    }
    else
    {
        //LPT.Write(adressport1, LPT.Register.DATA, port1); 
    }
 
 
 
 
    sax = 0;
 
 
    Xv = SmoveX - 2 * LochalAxx;
    if (SmoveX <= 2 * LochalAxx)
    {
        LochalAxx = ((SmoveX / 2));
 
        LochalAxx = ceil(LochalAxx);
 
 
        Xv = 0;
    }
 
 
    sax = 0;
 
    //Начало движения
    //uint portx = 3;
    // port1 = port1 | 3;
    colshagx = (int)SmoveX;
 
    
    
    int ax;
//_outp(888,port1);
//ax=_inp(888);
 
 
double long imptimex=350.0E-6,imptimey=340.0E-6, TimerX,TimerY,WaitTimeX,WaitTimeY;
LARGE_INTEGER   StartX,StartY;
    //TimerStart();
    StartY=TimerStart();
    StartX=TimerStart();
    WaitTimeX=T0;
        WaitTimeY=T0y;
        bool exit=false;
 while (!exit)
 {
TimerX=timerOut(StartX);
TimerY=timerOut(StartY);
if((TimerX>WaitTimeX)&&(colshagx != 0))
{
    if ((sax <= Aximp))
    {
 
        T = T0 / (1 + T0 * (LochalAx / ShagX * Kdx) * t);
        t = t + T;
        WaitTimeX=T;
        sax++;
    }
    else  if (MoveXplavn)
    {
        if (sax == LochalAxx * 2 - 1)
        {
            WaitTimeX=T0;
 
        }
        else
        {
 
            T = T0 / (1 + T0 * (Ax / ShagX * Kdx) * t);
            t = t - T;
            WaitTimeX=T;
 
            sax++;
 
        }
        MoveXplavn=false;
        exit=true;
    }
    else if (!MoveXplavn)
    {
 
 
        if (colshagx > Aximp)
        {
            WaitTimeX=LochalTimpx;
            
 
        }
 
    }
       
    
    //ax=_inp(888);
    ax=ax^1;
    //_outp(888,ax);
    ax=ax^1;
//  _outp(888,ax);
    colshagx--;
    
    StartX=TimerStart();
}
 
}
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.04.2020, 13:08
Для начала инициализируй MoveXplavn до старта потока. Уверен, что в else if (в PlavnX ()), вообще заход происходит?
0
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177
06.04.2020, 13:56  [ТС]
nd2,Возможно я вас не так понял
но выделение памяти происходит еще до того как появятся элементы на форме
C++
1
2
3
4
5
6
7
8
9
  public ref class Form1 : public System::Windows::Forms::Form
    {
     bool MoveXplavn;   
    public:
        Form1(void)
        {
 
            InitializeComponent();          
        }
Далее когда элементы появляются и есть событие загрузки формы там этой переменной присваивается значение false


И значение false присваивается до того как запуститься создаться поток
C++
1
2
3
4
5
6
7
8
9
private: System::Void button22_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
             NapX=0; MoveXplavn=false;
                SmoveX=100;
             move   = gcnew Thread(gcnew ThreadStart(this,&Form1:: PlavnX));           
         move->Priority=ThreadPriority::Highest;
            move->IsBackground   = true;
 move->Start();
 
         }
Если вы говорите про этот участок кода то да сюда заходит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
 else if (!MoveXplavn)
    {
 
 
        if (colshagx > Aximp)
        {
            WaitTimeX=LochalTimpx;
            
 
        }
 
    }
А если я запускаю с значением true то не заходит в код выше а заходит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
else  if (MoveXplavn)
    {
        if (sax == LochalAxx * 2 - 1)
        {
            WaitTimeX=T0;
 
        }
        else
        {
 
            T = T0 / (1 + T0 * (Ax / ShagX * Kdx) * t);
            t = t - T;
            WaitTimeX=T;
 
            sax++;
 
        }
        MoveXplavn=false;
        exit=true;
    }
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2020, 01:01
И что, тогда, не работает?
0
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177
08.04.2020, 12:29  [ТС]
nd2, не работает по этому и тему создал
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2020, 15:38
Лучший ответ Сообщение было отмечено Leitto как решение

Решение

Цитата Сообщение от Leitto Посмотреть сообщение
не работает
Что конкретно не работает? Что должно произойти в потоке, когда MoveXplavn станет true?

Добавлено через 1 час 18 минут
Вот я убрал из функции всё, что мешает дойти коду до проверки MoveXplavn, и добавил вывод сообщения, если код дошёл до этого места. Сообщение выводится при отпускании кнопки мыши. Значит всё отслеживается.
Кликните здесь для просмотра всего текста
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
void PlavnX ()
{
 //   int realipx = 0;
    //LochalAx = Ax;
 //   LochalVx = Vx;
 //
 //   Simpx = ShagX * (1 / Kdx);
 //   T0 = sqrt(Simpx / LochalAx);
 //   LochalTimpx = (Simpx) / LochalVx;
    //
    //t = T0;
 //   T = T0;
 //   // richTextBox3.Text += "\n " + (T0*1000).ToString() + " номер " + Aximp.ToString();
 //   Aximp = 1;
    while (0/*T >= LochalTimpx*/)
    {
  //      T = T0 / (1 + T0 * (LochalAx / ShagX * Kdx) * t);
  //      t = t + T;
  //      // 
        //if ((T >= LochalTimpx))
  //      {
        //  Aximp++;
        //}
    }
    //T = T0;
    //t = T0;
    //LochalAxx = Aximp;
    ////  ulong port1 = 0;
    //// выставляем в порту  11
    //port1 = port1 | 3;
    //// udelay((long)((0.00003 * 10000000000)));
    ////выставляем вращение вправо
    if (0/*NapX == 1*/)
    {
        //выставляем вращение вправо
        //port1 = port1 ^ 2;
        //LPT.Write(adressport1, LPT.Register.DATA, port1);
    }
    else
    {
        //LPT.Write(adressport1, LPT.Register.DATA, port1); 
    }
 
    /*sax = 0;
    
    Xv = SmoveX - 2 * LochalAxx;
    if (SmoveX <= 2 * LochalAxx)
    {
        LochalAxx = ((SmoveX / 2));
        LochalAxx = ceil(LochalAxx);
        Xv = 0;
    }
    sax = 0;*/
 
    //Начало движения
    //uint portx = 3;
    // port1 = port1 | 3;
 //   colshagx = (int)SmoveX;
    //int ax;
    ////_outp(888,port1);
    ////ax=_inp(888);
    //
    //double long imptimex=350.0E-6, imptimey=340.0E-6, TimerX, TimerY, WaitTimeX, WaitTimeY;
    //LARGE_INTEGER   StartX,StartY;
 //   //TimerStart();
 //   StartY = TimerStart();
 //   StartX = TimerStart();
 //   WaitTimeX = T0;
 //   WaitTimeY = T0y;
    bool exit = false;
    
    while (!exit)
    {
        //TimerX=timerOut(StartX);
        //TimerY=timerOut(StartY);
        if(1/*(TimerX > WaitTimeX) && (colshagx != 0)*/)
        {
            if (0/*(sax <= Aximp)*/)
            {
                /*T = T0 / (1 + T0 * (LochalAx / ShagX * Kdx) * t);
                t = t + T;
                WaitTimeX = T;
                sax++;*/
            }
            else  if (MoveXplavn) 
            {
                /*if (sax == LochalAxx * 2 - 1)
                {
                    WaitTimeX=T0;
                }
                else
                {
                    T = T0 / (1 + T0 * (Ax / ShagX * Kdx) * t);
                    t = t - T;
                    WaitTimeX=T;
                    sax++;
                }*/
                System::Windows::Forms::MessageBox::Show("true"); // сработало изменение MoveXplavn на true
                MoveXplavn = false;
                exit = true;
            }
            else if (!MoveXplavn)
            {
                /*if (colshagx > Aximp)
                {
                    WaitTimeX=LochalTimpx;
                }*/
            }
            //ax=_inp(888);
            //ax=ax^1;
            //_outp(888,ax);
            //ax=ax^1;
            //  _outp(888,ax);
            //colshagx--;
    
            //StartX=TimerStart();
        } // if((TimerX>WaitTimeX)&&(colshagx != 0))
    } // while (!exit)
 
}
1
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177
09.04.2020, 01:20  [ТС]
nd2, большое спасибо буду искать ошибку в алгоритме
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2020, 01:20
Помогаю со студенческими работами здесь

Передача сообщения или переменной по локальной сети
долго гуглил, но так ничего и не получается реализовать работает код вот от сюда: Как послать сообщение компьютеру в локальной сети ...

Передача переменной функции или свойства объекта
Всем доброго времени суток! Имеется некий код. Хочу отобразить в виде формы прогрессбар во время выполнения кода. Скриншот кода: ...

передача переменной в процедуру, или как определить какая картинка была нажата
помогите передать переменную в процедуру. или подскажите как определить (номер\имя\чтонибуть уникальное) нажатой картинки procedure...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции.
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

Перенос процедуры из события в поток
Здравствуйте, уважаемые! С написание простейших программ сталкиваюсь крайне редко, но бывает. И сегодня мне нужна Ваша помощь. Сделал...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru