Независимые потоки

Статус
В этой теме нельзя размещать новые ответы.

tarakan19832

Турист
Регистрация
12 Авг 2016
Сообщения
6
Реакции
0
Credits
6
Есть mdi приложение (программа для работы с УТМ ЕГАИС – если знаете что это) и скажем 2 child формы.
Форма 1.
На форме есть кнопка, по кнопке запускается поток, который обращается к ресурсу Для просмотра ссылки Войди или Зарегистрируйся, загружает документы, обрабатывает их и т.п. и т.д. На форме есть ProgressBar, который отображает ход процесса, т.е. в процедурах synchronize конкретно указана форма и компонент, который надо менять form1. ProgressBar.position := PROGRES.
На форме 2 есть также кнопка, которая запускает тот же самый поток и ProgressBar, который надо менять, но как сделать так,
1. Чтобы в зависимости от того какая форма вызвала поток, на той форме и менялись контролы
2. Идеально было бы, если бы каждый вызов потока работал независимо от другого. И обновлял нужные контролы.
Подскажите как это осуществить.
 

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Ничего не понял, ну да ладно
 

tarakan1983

Турист
Регистрация
30 Июл 2016
Сообщения
8
Реакции
0
Credits
16
Отвечаю сам себе
Код:
TMyThread =class(TThread)
private
  FmyControl: TProgressBar;
public
  constructor Create(suspend: boolean; Eventcontrol: TProgressBar);
protected
  procedure SynchoEvent;
end;

constructor TMyThread.Create((suspend: boolean; Eventcontrol: TProgressBar);
begin
  inherited Create(suspend);
  self.FMycontrol:=EventControl;// мы будем работать вот с ней
end;

procedure TMyThread.SynchoEvent;
begin
  self.Eventcontrol.Position:=.......// и работаем с ней
end;
Направили в правильную сторону на другом формуме
 
Последнее редактирование модератором:

Keoda

Местный
Регистрация
19 Ноя 2014
Сообщения
31
Реакции
25
Credits
62
Передавай в поток не TProgressBar а указатель на форму, захочешь управлять из потока чем-то ещё на форме - пригодится.
 

tarakan1983

Турист
Регистрация
30 Июл 2016
Сообщения
8
Реакции
0
Credits
16
Keoda, а как передать указатель на всю форму не покажете?
Потому что на одной форме надо менять groupbox.caption, на другой label.caption на третей #какойтолевыкомпонент.caption или #какойтолевыкомпонент.color или #какойтолевыкомпонент.#какоетосвойство.
И самое главное как потом обратиться к свойству этого компонента
 
Последнее редактирование модератором:

StrikerLoner

Турист
Регистрация
24 Июл 2009
Сообщения
10
Реакции
0
Credits
20
Сразу имеется готовый ответ, если имеется разное количество объектов для обработки, то нужно создать один объект прокладку например
Type
TTMYProxyObjectType = (potNone, potProgress, potGroupBOX, pot<ЧтотоТамМного обектов>)
TMYProxyObject = class
private
FAction: TTMYProxyObjectType;
FProgress: TProgressBar;
FGroupBox: TGroubBox;
FLabel: TLabel;
FLabel_Other: TLabel;

public
property Action: TTMYProxyObjectType read FAction write FAction;

// Ниже описываем все типы контролов которые будут использованы
property Progress: TProgressBar read FProgress write FProgress;
property GroupBox: TGroubBox read FGroupBox write FGroupBox;
property Label: TLabel read FLabel write FLabel;
property Label_Other: TLabel read FLabel_Other write FLabel_Other;
end;

и уже в обработке самого потока смотрим свойство данного объекта Action и работаем с соответствующими свойствами
 

oakrom

Местный
Регистрация
2 Авг 2014
Сообщения
20
Реакции
4
Credits
34
а как передать указатель на всю форму не покажете?

ну примерно вот так:

Код:
constructor Create(suspend: boolean; aSomeForm: TForm);

а обращаться можно примерно вот так:

Код:
(aSomeForm.SomeComponent as TLabel).Caption:='блаблабла';
 

Keoda

Местный
Регистрация
19 Ноя 2014
Сообщения
31
Реакции
25
Credits
62
Но, лучше форму из потока не менять. Я, как правило, отправляю из потока PostMessage.
Код:
typedef struct {
HWND__*   hWindow;
unsigned int Msg;
} MessageFromThread;

MessageFromThread msge_params;
msge_params.hWindow = this->Handle;
msge_params.Msg = MSGE_THR_YOUR_MESSAGE_MACRO;
CreateThread(NULL, 0, YourProc, &MessageFromThread, 0, NULL);
Только помните о памяти, через которую идет обмен данными, она должна существовать на пртяжении всего вызова
 

keep91

Турист
Регистрация
1 Июл 2016
Сообщения
2
Реакции
0
Credits
4
Извините что наверно не в тему. Но как можно завершить поток из основного тела программы?
 

Error_999

Местный
Регистрация
25 Дек 2012
Сообщения
30
Реакции
3
Credits
48
вызвать метод Terminate через указатель на поток
 

pornov

Турист
Регистрация
4 Сен 2014
Сообщения
6
Реакции
0
Credits
8
вызвать метод Terminate через указатель на поток

Terminate лишь устанавливает внутреннюю переменную Terminated в true, что завершает основной цикл в Execute:

Код:
procedure TMyThread.Execute;
begin
  while not Terminated do
    begin
      // тело "вечного" цикла
    end;
end;

После завершения потока необходимо освободить ресурсы вызовом Free.
Кстати, судя по исходникам можно вообще просто вызывать Free, т.к. Terminate вызывается из него:

Код:
destructor TThread.Destroy;
begin
  if (FThreadID <> 0) and not FFinished and not FExternalThread then
  begin
    Terminate;
    if FCreateSuspended then
      Resume;
    WaitFor;
  end;
 ...
end;

Я лично также как и Keoda отправляю данные из потока в главную форму через сообщения, благо там можно все что хочешь передать - текст, число, структуру.
 

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
ТС забил тема закрывается
 
Статус
В этой теме нельзя размещать новые ответы.