Поток в C++ Builder и передача параметров

Потоки или нити C++ BuilderТема потоки в C++ Builder неплохо освещена в различных учебниках по С++Builder. Но ни в одном из просмотренных мною букварей я не нашел освещение вопроса обмена параметрами между модулем формы и модулем (модулями) потока в среде C++Builder. Прежде чем подробно осветить эту небольшую тему начнем с простого, повторим как в Builder создается поток или модуль потока. Для этого создадим новое приложение в котором будет создан модуль формы (например Unit1.cpp) и его хедер Unit1.h

Как известно для создания многопоточных приложений в C++Builder реализован абстрактный класс TThread. Класс допускает создание отдельных потоков выполняющихся в приложении. Чтобы создать поток необходимо создать потомок этого класса. Это делается несложо File | New | Other | Thread Object. Далее появится окно где необходимо както обозвать новый поток (например TMyThread). В результате появится новый модуль (например Unit2.cpp), содержащий описание этого класса TMyThread, его конструктор и метод Execute()

__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
//---- Здесь код потока ----
}
//---------------------------------------------------------------------------

и его хедер Unit2.h где представлен собственно класс нового потока

class TMyThread : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall TMyThread(bool CreateSuspended);
};

И вот теперь самое важное. Для того, чтобы работать с вновь созданным потоком, передавать в него параметры из модуля формы и получать параметры из модуля потока в модуль формы необходимо внимание:

  • В модуле формы создать указатель на поток (например TMyThread *Thr )
  • В модуле формы создать объект класса потока (Thr = new TMyThread(true) ) true - в приостановленном состоянии

Теперь, имея указатель (фактически адрес памяти где находится объект) на вновь созданный объект класса потока можно передавать в модуль потока данные из модуля формы и обратно. В тривиальном варианте это делается так:

Thr->ThreadParam1 =...; // в модуль потока из модуля формы
... = Thr->ThreadParam2; // из модуль потока в модуль формы

При этом ThreadParam1, 2 вполне можно объявлять в классе потока (модуль Unit2.h). Подробнее все это можно проследить в проекте небольшой тестовой программки (C++ Builder 5) скриншет которой представлен ниже.

C++Builder Передача параметров в потокПрограммка устроена достаточно просто. При нажатии на Button1 запускается поток в котором принимаются параметры из модуля формы и самой формы, с сними совершаются некоторые действия. Поток возвращает в модуль формы другие параметры которые отображаются на форме. Проще говоря потоку передаются три переменные - две из них (A и B) из окон ввода и одна самостоятельно. A и B в потоке суммируются и умножаются на третью переменную (в данном случае 2). Результат возвращается обратно в модуль формы и отображается на самой форме. Button2 приостанавливает поток. Подробнее процедуру взаимной передачи параметров из основного модуля в модуль потока и обратно вполне можно уяснить внимательно просмотрев исходные модули проекта примера.

Если кому это все пригодилось оставьте свой коммент. У кого есть замечания тоже можно их выссказать перйдя по ссылке для добавления комментов.

комментариев: (8)

Перейти и растаять в своей любимой социалке