Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2015, 08:06   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Получение данных из потока

Привет.

Код:
type
  Thread = class(TThread)
     a,b : integer;

var
  TH:Thread;

procedure Thread.Execute;
begin
  a := 1;
  b := 2;
end;
Как вытащить эти данные (a,b) из потока?

Код:
TH.a
Вот так не получается, переменная пустая, так как поток уже завершился.

Понятное дело, что если подключить к этому потоку форму, то проблема решится путем присваивания этих переменных к глобальным, которые были объявлены на форме, но хочется сделать это не подключая форму.

Подскажите?


UPD

Моя проблема заключается в следующем:

С помощью браузера я в потоке выполняю переход на страницу и мне нужно дождаться события OnDocumentComplete, чтобы выполнить какие-то действия и из этих действий получить результат. Так вот, как сделать чтобы поток завершался только после события OnDocumentComplete, иначе поток завершается не дожидаясь события и я не получаю результат.​

Последний раз редактировалось bilibian; 07.11.2015 в 18:15. Причина: update
bilibian вне форума Ответить с цитированием
Старый 07.11.2015, 08:28   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Покажи класс треда полностью.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.11.2015, 08:39   #3
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Покажи класс треда полностью.

Код:
type
  Thread = class(TThread)
    a,b : integer;
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
bilibian вне форума Ответить с цитированием
Старый 07.11.2015, 08:45   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А теперь скажи, в какие моменты тебе нужны значения a и b.
B покажи код треда полностью, включая то, что в разделе implementation.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 07.11.2015 в 08:51.
min@y™ вне форума Ответить с цитированием
Старый 07.11.2015, 09:01   #5
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
А теперь скажи, в какие моменты тебе нужны значения a и b.
B покажи код треда полностью, включая то, что в разделе implementation.
Мне нужно выдернуть эти данные в основной поток формы, но поток завершается быстрее, чем я успеваю их запросить путем "TH.a" или "TH.b"

в implementation ничего нет, но для решения проблемы туда можно добавить Unit1 и присвоить a и b к глобальным переменным в основном потоке формы. Интересует решение без подключения формы (основного потока).

Код:
unit ...;

interface

uses ...

type
  Thread = class(TThread)
    a,b : integer;
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
  
var
  TH:Thread;
  
implementation

procedure Thread.Execute;
begin
  a := 1;
  b := 2;
end;

end.

Последний раз редактировалось Stilet; 07.11.2015 в 09:51.
bilibian вне форума Ответить с цитированием
Старый 07.11.2015, 09:06   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Мне нужно выдернуть эти данные
в какой момент-то?
Цитата:
в implementation ничего нет
ну это ж неправда! реализация метода execute() должна же быть, ёмаё!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.11.2015, 09:08   #7
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
в какой момент-то?
По запросу из основного потока формы.

То есть, потоку дали задание, он его выполнил и получил результат. Этот результат нужно получить по запросу из основного потока формы. Или перенести результат в основной поток не подключая его через uses.

Последний раз редактировалось Stilet; 07.11.2015 в 09:51.
bilibian вне форума Ответить с цитированием
Старый 07.11.2015, 09:18   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
По запросу из основного потока формы.
Код:
type
  Thread = class(TThread)
  private
    Fa, Fb : integer;
  protected
    procedure Execute; override;
    property a: Integer read Fa;
    property b: Integer read Fb;
  end;

var
  TH:Thread;

implementation

procedure Thread.Execute;
begin
  Fa := 1;
  Fb := 2;
end;
теперь значения доступны извне:
Код:
x:= TH.a;
y:= TH.b;
Но только пока объект треда существует.
Если эти свойства у тебя - результаты работы треда, получай их в событии OnTerminate.
Если эти свойства тебе нужно получать в процессе выполнения треда (неоднократно), то изнутри Execute() нужно их выдавать синхронно с помощью Synchronize().
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.11.2015, 09:30   #9
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Если эти свойства тебе нужно получать в процессе выполнения треда (неоднократно), то изнутри Execute() нужно их выдавать синхронно с помощью Synchronize().
Пробовал с помощью Synchronize(), все хорошо, но при получении этих данных в последний раз - они приходят уже пустые.

Последний раз редактировалось bilibian; 07.11.2015 в 09:57.
bilibian вне форума Ответить с цитированием
Старый 07.11.2015, 09:33   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
но при получении этих данных в последний раз - они приходят уже пустые.
ну и чего ты от меня хочешь? Я ж не телепат, а код свой (реальный) ты мне так и не показал.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование потока IP-данных в проигрываемый видеофайл hr-mdis Фриланс 1 20.11.2014 17:23
получение данных из файла и запись этих данных в другой. Jurii77 Microsoft Office Excel 9 23.11.2011 09:42
Получение дескриптора окна по данным процесса/потока. StIX-S Win Api 8 07.07.2011 05:21
Удаление (Изменение) данных из потока chertovich Общие вопросы Delphi 14 26.12.2010 19:13
Извлечение данных из потока bug Общие вопросы Delphi 11 05.10.2009 14:34