Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обратиться к переменной потока из основного потока 
:(
    Опции темы
neweraser
Дата 10.4.2018, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 594
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Всем привет!
Программа подключается к базе и индексирует содержимое одной из таблиц. Чтобы программа не подвисала, решил все это дело сделать в потоке.

Класс потока:
Код

type
  TQueryThread = class(TThread)
  private
    { Private declarations }
    pOperation, CurrentStatus: String; // Переданный параметр в Execute и статус операции для главной формы
  protected
    procedure Execute; override;
    procedure UpdateStatus; // тут буду обновлять статус операции на главной форме
  public
    FDQuery: TFDQuery;
    constructor Create(Operation: string); overload;
    destructor Destroy; override;
  end;


В OnCreate главной формы настраиваю TFDConnection и запускаю поток:
Код

    AllEmplsQueryThread:= TQueryThread.Create('AllEmpls'); // все сотрудники
    AllEmplsQueryThread.FreeOnTerminate:= True;
    AllEmplsQueryThread.Start;

Немного поясню, TQueryThread.Create('AllEmpls') - создает поток и передает ему "дальнейшие действия", т.е. загрузка всех сотрудников:
Код

constructor TQueryThread.Create(Operation: string);
begin
  inherited Create(True);
  FDQuery:= TFDQuery.Create(nil);
  FDQuery.Connection:= BaseConnect; // TFDConnection, настроенное в onCreate
  POperation:= Operation; // Передаем название операции в Execute
end;

Код

destructor TQueryThread.Destroy;
begin
  FDQuery.Free;
  inherited;
end;

Код

procedure TQueryThread.Execute;
begin
  if pOperation = 'AllEmpls' then
  begin
    FDQuery.SQL.Add('SELECT * FROM DIC$$USERS'); 
    FDQuery.ResourceOptions.CmdExecMode:= amBlocking; // толком не понял что это, убрать?
    FDQuery.Open;
    CurrentStatus:= 'Индексация...';
    Synchronize(UpdateStatus);
    FDQuery.IndexFieldNames:= 'USER_ID'; // Индексируем по полю USER_ID
    CurrentStatus:= 'Индексация завершена';
    Synchronize(UpdateStatus);
  end;
  Suspended:= True; // Приостанавливаем поток
end;

А здесь обновляю статусы:
Код

procedure TQueryThread.UpdateStatus;
begin
  MainForm.StatusBar.Panels[0].Text:= CurrentStatus;
end;

Вопрос вот в чем, правильно ли я все делаю и как обратиться к FDQuery, допустим, вызвать FDQuery.Next из основного окна по нажатию кнопки, как найти сотрудника по ID? 

Это сообщение отредактировал(а) neweraser - 10.4.2018, 17:29


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
_zorn_
Дата 10.4.2018, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 988
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Какие то не понятные выпендрёжи с потоками (вы сами хоть понимаете что там происходит ?)
А в итоге какая то база (неизвестная, но думаю стандартная для студентов) и вопрос как в этой базе что то найти... Причем с помощью компонентов делфи (который уже мёртв... поверь мне).

Если решил через компоненты, то вообще непонятно откуда в твоём коде взялись запросы... Там же же все через "next", "property" и т.п. делается
PM MAIL   Вверх
neweraser
Дата 10.4.2018, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 594
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



 smile 

Цитата(_zorn_ @  10.4.2018,  18:20 Найти цитируемый пост)
Какие то не понятные выпендрёжи с потоками (вы сами хоть понимаете что там происходит ?)

Если бы не понимал - так не стал бы расписывать, и если нужны потоки, значит в программе им место. А вам если нечего ответить по теме - можно было пройти мимо и не выпендриваться  smile 

Цитата(_zorn_ @  10.4.2018,  18:20 Найти цитируемый пост)
А в итоге какая то база (неизвестная, но думаю стандартная для студентов) 

А разве это имеет какое-то значение? Для студентов или рабочий проект?


Цитата(_zorn_ @  10.4.2018,  18:20 Найти цитируемый пост)
который уже мёртв... поверь мне

Я тоже так думал, но, поверь мне, нет  smile 

Цитата(_zorn_ @  10.4.2018,  18:20 Найти цитируемый пост)
Там же же все через "next", "property" и т.п. делается 

Где там?  smile 

зы. Большая просьба отвечать по теме, либо вообще не отвечать, или натолкните меня на путь правильный) 
зызы. Да, да. Мне надо именно через потоки.


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 10.4.2018, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7273
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 25
Всего: 143



корректная работа с потоками должна быть чем аналогичным Synchronize 
в вашем варианте кода , эффективность минимальна (если запросы не выполняются к базе долго) ИМХО
обращение по ссылкам из потока вообще очень проблематично (т.е. даже более потоконебезопасно) 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
neweraser
Дата 11.4.2018, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 594
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Цитата(Romikgy @  10.4.2018,  22:48 Найти цитируемый пост)
если запросы не выполняются к базе долго

Таблица в базе довольно большая, индексация занимает больше минуты. Хотелось бы видеть это в отдельном потоке, что я и сделал, чтобы не висела форма. О других запросах речи пока нет, вопрос в том, как теперь обратиться из основного потока программы к дочернему потоку, в котором на данный момент загружен и проиндексирован FDQuery.


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 11.4.2018, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7273
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 25
Всего: 143



http://gurin.tomsknet.ru/delphithreads.html
это работа с потоками 

обращаться надо через мутексы или  чем то подобным 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
neweraser
Дата 11.4.2018, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 594
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Немного переписал код:
Form1.OnCreate
Код

  AllEmplsQueryThread:= TQueryThread.Create(True);
  AllEmplsQueryThread.FreeOnTerminate:= True;
  AllEmplsQueryThread.ThreadOperation:= 'AllEmpls';
  AllEmplsQueryThread.Start;

Класс потока
Код

type
  TQueryThread = class(TThread)
  private
    { Private declarations }
    CurrentStatus: String; // статус операции для главной формы
    Operation: String; // тип операции
  protected
    procedure Execute; override;
    procedure UpdateStatus; // обновление статуса на главной форме
  public
    FDQuery: TFDQuery;
    property ThreadFDQuery: TFDQuery read FDQuery;
    property ThreadOperation: String write Operation;
    destructor Destroy; override;
  end;

Execute потока
Код

procedure TQueryThread.Execute;
var
  msg: TMsg;
begin
  FDQuery:= TFDQuery.Create(nil);
  Synchronize(procedure
              begin
              FDQuery.Connection:= BaseConnect;
              end);
  if Operation = 'AllEmpls' then
  begin
    FDQuery.SQL.Add('SELECT * FROM DIC$$USERS');
    FDQuery.ResourceOptions.CmdExecMode:= amBlocking; // толком не понял что это, убрать?
    FDQuery.Open;
    CurrentStatus:= 'Индексация...';
    Synchronize(UpdateStatus);
    FDQuery.IndexFieldNames:= 'USER_ID';
    CurrentStatus:= 'Индексация завершена';
    Synchronize(UpdateStatus);
  end;
  // Ожидаем дальнейших действий пользователя
  Suspend;
end;


Но вопрос остается тем же. Использовать waitfor? Или может из основного потока передавать дочернему параметр и suspended = false? Потом как только поток обработает этот параметр - возвращаться через goto к suspend? Как-то кривовато получается...

Добавлено через 1 минуту и 48 секунд
Romikgy, спасибо, сейчас посмотрю  smile 


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 11.4.2018, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7273
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 25
Всего: 143



Цитата(neweraser @  11.4.2018,  08:41 Найти цитируемый пост)
Execute

исполняется один раз 
Цитата(neweraser @  11.4.2018,  08:41 Найти цитируемый пост)
Suspend;

в конце делать суспенд бессмысленно 
для обращения из главного потока к дочернему надо использовать что то аналогичное 
Цитата(neweraser @  11.4.2018,  08:41 Найти цитируемый пост)
Использовать waitfor?

или же сделать периодичный опрос дочерним потоком главного через Synchronize

Это сообщение отредактировал(а) Romikgy - 11.4.2018, 09:47


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_zorn_
Дата 24.4.2018, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 988
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(neweraser @  11.4.2018,  03:30 Найти цитируемый пост)
поверь мне, нет  smile 


Провакацилггый влпрос по беспатовке "а кроме паскали ты что нибудь знаешь ?"
А мёртв он именно потому что у "заказчиков" тяму не хватает. Ну мля, пхп и то дальше ушел по развитию.
ДЕЛФИ - это же ЫнтЫрпрайз. Стойте постойте. Вроде ЯВА на ЫНТЫРПРАЙЗЕ. Нах какой то не понятный язык учить если есть ЯВА ? )
PM MAIL   Вверх
Romikgy
Дата 24.4.2018, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7273
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 25
Всего: 143



дык и ява не панацея.... 
имхо офтопим, даже по разделу...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Google
  Дата 20.6.2019, 20:05 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.