6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177

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

03.04.2020, 11:09. Показов 2345. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru