Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/48: Рейтинг темы: голосов - 48, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 07.07.2010
Сообщений: 7

Передача параметров в поток и обратно

05.10.2010, 11:13. Показов 9844. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть поток (модуль потока Unit2.cpp)

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
 
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall Unit3::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall TMyThread2::TMyThread2(bool CreateSuspended)
  : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread2::Execute()
{
  FreeOnTerminate = true;
  while (!Terminated)
  {
    Synchronize(pb2);
    if(Tr2 == false)
      {Synchronize(UpdateCaptionStartThr2);}
    if(Tr2 == true)
      {Synchronize(UpdateCaptionStopThr2);}
  }
}
Управляется поток из формы (Unit1.cpp)

C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  Tr2 = false;
  Thr2->Resume();
  Thr2->Priority = tpLower;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button6Click(TObject *Sender)
{
  Tr2 = true;
}
Tr2 объявлена в .h файле который виден обеим модулям.

Но при запуске потока похоже, что Tr2 в потоке не работает. Не видит он ее. Или видит только один раз.

Подскажите пожалуйста как передавать параметры из формы в поток и из потока в форму.

Добавлено через 19 часов 51 минуту
Никому нечего ответить.
Тогда немного проще.
Вот как предлагает сам Билдер (только создание потока без дальнейших объяснений)

В модуле формы (например Unit1)
C++
1
2
3
4
// создаем поток в приостановленном состоянии (true), запущенном (false)
TMyThread1 *Thr1 = new TMyThread1(true); 
// глобальная перем.
char A = 123;
//
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Тепрерь сам поток (например модуль Unit2)
//содержит описание класса TMyThread, его конструктор и метод Execute() 
__fastcall TMyThread2::TMyThread(bool CreateSuspended)
  : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
  FreeOnTerminate = true;
  while (!Terminated)
  {
    ... Нужно что-то выполнить с переменной A и передать в модуль формы
    результат в виде переменной В
    Sleep(1);
  }
}
Опять же в модуле формы
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // запускаем поток
  Thr->Resume();
  ... тут нужно передать потоку A
}
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   .... тут нужно принять из потока B
}
Как правильно будет выглядеть передача переменных в поток из модуля формы и обратно из модуля потока в модуль формы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.10.2010, 11:13
Ответы с готовыми решениями:

Передача параметров в поток
Добрый день. Имеется основная форма, где объявлена переменная AnsiString LineMessage. Там же в нее заносится содержание текстового файла....

Добавление параметров в работающий поток (TThread)
Объясню что хочу сделать: 1) Есть поток (TThread) 2) Есть вектор - член этого потока 3) В цикле поток обрабатывает весь вектор:...

Передача в поток
Доброго дня, ребята подскажите как правильно реализовать bool Unlocker(AnsiString FileName) // { STARTUPINFO si = {0}; ...

2
1 / 1 / 2
Регистрация: 07.11.2009
Сообщений: 4
05.10.2010, 12:14
Не знаю, правильно я Вас понял, я так понял Вы не можете передать параметры в поток
я делал это так:
Unit2.h
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
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
class TMyThread : public TThread
{
private:
protected:
        void __fastcall Execute();
        void __fastcall pb();                         // функция, которая выводит некоторую информацию 
                                                            //  в форме в надписи, которую получил поток при создании
        TLabel * Label;                               // Указатель на надпись на форме, передаётся при создании 
                                                            // потока
        int n;                                             // переменная, выводимая в надписи
public:
        __fastcall TMyThread(bool CreateSuspended);
        __fastcall TMyThread(bool CreateSuspended, TLabel * L); //конструктор класса, в котором вторым 
                                                                                      // параметром является указатель на 
                                                                                      // надпись в форме
};
Unit2.cpp
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
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TMyThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended), n(0)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
      FreeOnTerminate = true; // освободить занятую потоком память по окончании его работы
     for(int i=0; i<10000; i++)
       {
        // -- какие-то сложные вычисления в цикле
        // ---
        if(Terminated) break;  // прекратить извне поток
        Synchronize(pb);
       }
}
//--------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended, TLabel * L): TThread(CreateSuspended), n(0), Label(L) //определение конструктора
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::pb()
{
       n++;
       this->Label->Caption = IntToStr(n);
       Application->ProcessMessages();
}
Unit1.cpp
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TMyThread *Thr1;
TLabel *L;           //объявляем указатель на надпись
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
L = Form1->Label1;       // при создании формы записываем в указатель адресс на Label1, куда будут
                                 // выводится значения
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thr1 = new TMyThread(false, L);                   // создание потока
}
//----------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
L = Form1->Label2;           // при нажатии на вторую кнопку в указатель записывается адресс на другую
                                     // надпись, и, следовательно, при повторном нажатии на кнопку 1 значения
                                     // будут выводится в другую надпись
}
Это, что касается передачи параметров в поток, для того, что бы получать из него параметры можно объявить в его классе переменную, в которую в процессе работы будут записываться значения и после его отработки обратится к этой переменной (ну или же передавать в поток ссылку на переменную, что бы он менял её значения в процессе работы)

Надеюсь я Вас правильно понял и смог ответить на Ваш вопрос
1
0 / 0 / 1
Регистрация: 07.07.2010
Сообщений: 7
06.10.2010, 12:01  [ТС]
Спасибо. Уже ближе. Но не работает.
Вы меня правильно поняли. Я пытаюсь понять как оптимально организовать передачу параметров из модуля формы в модуль потока и обратно (C++Builder). Фактически получается, как обмениваться данными между двумя потоками (поскольку модуль формы это тоже поток)?

Вот например как предлагается (встречал где то)

Unit2.h файл модуля потока
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
//---------------------------------------------------------------------------
#include <Classes.hpp>
// Создается класс параметров (например)
class TThExParams
{
public:
  bool A;
  char B;
  int C;
  long D;
};
//---------------------------------------------------------------------------
class TMyThread : public TThread
{
private:
protected:
  void __fastcall Execute();
  void __fastcall pb();
public:
  TThExParams *ThExParams; // я так понимаю - здесь указатель на класс параметров
  __fastcall TMyThread(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
В модуле потока (например Unit2.cpp)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
__fastcall TMyThread::TMyThread(bool CreateSuspended)
  : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
  for(int i=0; i<10000; i++)
  {
   if(Terminated) break;     
   Synchronize(pb);
  }
}
 
void __fastcall TMyThread::pb()
{
  // тут установка параметров принадлежащих класу TMyThread
  ThExParams->A = 0;
  ThExParams->B = 123;
  ThExParams->C = 456;
  ThExParams->D = A*B;
}
1. При запуске потока он вылетает с raisen exception... на методе pb(). Почему?
2. Не понятно будут ли выдны в модуле формы переменные класса TThExParams?

Если пойти далее то пока не доходит вот, что:

1. Допустим в модуле формы определены какие-то глобальные переменные (char A; int B; long C
2. Как из модуля формы передать эти пременные (их значения) в поток (модуль потока), который совершит там с ними какие-то действия и возвратит результат обратно в форму в виде переменной (например long D), которую затем можно в любом виде отобразить на форме?

Добавлено через 20 часов 3 минуты
Спасибо.
Все работает.
Причина в том, что в модуле формы нужно создать указатель на поток.
TMyThread *Thr
Дальше через него уже можно все передавать и принимать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2010, 12:01
Помогаю со студенческими работами здесь

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

Передача аргумента в созданный поток
Здравствуйте, суть такова: Создаётся некий поток: DWORD WINAPI MyThread(LPVOID lpParam) { MyStruct data = *(MyStruct*)...

передача параметров
подскажите как из одной формы передать переменную int в другую

Передача параметров
Почему я не могу передать параметры в событии Button1Click, правильно ли заданы конструкторы?? ...

Передача 2-х параметров
Всем привет! Как передать другой программе 2 параметра, один параметр я передавал таким образом: ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru