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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2014, 17:02   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Я так понял переменная text в данном случае будет глобальной?
text = s ? в которой "передается" информация?
Да использование глобальной не желательно.
Используйте в таких случаях поле класса
Код:
TThtpThread =class
  private 
    S: string;
Или же можно сделать ДВЕ и более "синхропроцедуры"

Код:
Synchronize(startfunc);
...
Synchonize(finishproc);
Код:
procedure Tthrad.startfunc;
begin
   memo1.Add('start url='+url);
end;
procedure Tthrad.finishfunc;
begin
   memo1.Add('finish url='+url);
end;
procedure Tthrad.errorfunc;
begin
   memo1.Add('Error url='+url);
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.10.2014, 17:21   #12
vahdorf
Пользователь
 
Регистрация: 07.10.2014
Сообщений: 10
По умолчанию

Код:
...
var s:string;
...
procedure Tthread.startfunc;
begin
   memo1.Add(s);
end;
...
s:=inttostr(random(999));
Synchronize(startfunc);
...
Проверил сам - вариант с глобальной переменной дает ерунду. Например, при запуске сотни потоков с милисекундной разницей у меня в memo1 дал одну и ту же строку сто раз.

Цитата:
Сообщение от evg_m Посмотреть сообщение
Используйте в таких случаях поле класса
Код:
TThtpThread =class
  private 
    S: string;
Такой вариант дает разные сообщения в memo1, что и требуется.
vahdorf вне форума Ответить с цитированием
Старый 08.10.2014, 17:59   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я так понял переменная text в данном случае будет глобальной?
Ни разу не глобальной. Ты не внимательно прочитал мой пример )
Переменные которые будут работать с потоком должны быть полями класса потока.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.10.2014, 12:22   #14
vahdorf
Пользователь
 
Регистрация: 07.10.2014
Сообщений: 10
По умолчанию

Подниму тему, так как основной вопрос остался открытым. Можно ли сделать универсальную функцию получения информации из интернета, реализованную через потоки, вида
function GetData(url:string):string;
с вызовом из разных частей основной программы, чтобы при выполнении кода внутри GetData программа не "подвисала" на неопределенное время?

В основной части программы нужен следующий алгоритм:

function getmode1(request:string):string;
...
обработка переменной request и формирование переменной url и другая предварительная подготовка данных
text:=GetData(url);
здесь следует обработка полученной переменной text и формирование результата функции getmode1
...

function getmode2(request1,request2:integer) :string;
...
обработка переменных request1, request2 и формирование переменной url и другая предварительная подготовка данных
text:=GetData(url);
здесь следует обработка полученной переменной text и формирование результата функции getmode2
...
... и еще много таких getmode с разными по набору параметров ...


То есть до переходов к обработке text нужно "дождаться" результата от GetData(url). Как это сделать, чтобы программа не "подвисала"?

Последний раз редактировалось vahdorf; 10.10.2014 в 13:06.
vahdorf вне форума Ответить с цитированием
Старый 10.10.2014, 15:05   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Можно ли сделать универсальную функцию получения информации из интернета, реализованную через потоки, вида
function GetData(url:string):string;
И да, и нет.
Да -получение информации без остановки основной в принципе возможно.
Нет - функция по своему определению должна дождаться получения результата. (т.е. зависание)

НО! возможно написание процедуры в которой мы можем запустить поток и выйти не дожидаясь его завершения.
И можем при этом попросить поток "проинфомировать" нас о завершении получения данных.
для этого использовать процедурный тип.
Код:
TProcAfterGet =procedure(t: TThtread) of object;

procedure StartGetData(url: string; doAfterGet: TProcAfterGet);
begin
  T:=TMyThread.Create(false);
  t.url:=url;
  t.OnAfterGet:=doAfterCet; //настроили работу
  t.resume; // запустили и "забыли"
end;
Код:
TMyThread =class(TThread)
protected
  procedure RunAfter;
public
  property OnAfterGet: TProcAfterGet;
  property url: string;
  property webtext: string;
end;

procedure TMyTread.Execute;
var
   http: THTTP; //для каждого потока должен быть СВОЙ объект, так что используем локальный (можно поле класса)
begin
   http:=THTTP.Create;
   webtext:=http.Get(self.url);// дождались получения 
   synchonize(runAfter); //и синхронизированно запустили процедуру информирования  о результатах
end;

procedure TMyThread.runAfter
begin
  self.onAfterGet(self);//запуск процедуры извещения результатов с указанием чьи они (какого именно потока)
end;
Код:
Tform1 =class
protected
   procedure DoAfterLoad(t: TMyThread); //Процедура приема данных от потоков.
end;

procedure  Tform1.ButtonClick(sender: TObject);
begin // запуск произвольного числа чтений
  StartData('hhtp://w1', self.DoAfterLoad);
  StartData('hhtp://w2', self.DoAfterLoad);
  StartData4('hhtp://w4', self.DoAfterLoad4);
// в режиме "запустили и забыли"
end;

procedure TFrom1.doAfterLoad(t: TMyThread);
begin // принимаем данные от потока 
  showmessage(t.url, t.webText);
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.10.2014 в 15:31.
evg_m вне форума Ответить с цитированием
Старый 10.10.2014, 15:37   #16
vahdorf
Пользователь
 
Регистрация: 07.10.2014
Сообщений: 10
По умолчанию

Спасибо. Сейчас пробую запустить тест с предложенным вами кодом.
Поместил "TProcAfterGet =procedure(t: TThread) of object;" в раздел type модуля потока (может не туда нужно???), ошибка компиляции на строчке "property OnAfterGet: TProcAfterGet;" -> "[dcc32 Error] threads.pas(55): E2128 INDEX, READ or WRITE clause expected, but ';' found"
vahdorf вне форума Ответить с цитированием
Старый 10.10.2014, 15:58   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Поместил "TProcAfterGet =procedure(t: TThread) of object;" в раздел type модуля потока (может не туда нужно???)
Да так.

Цитата:
ошибка компиляции на строчке "property OnAfterGet: TProcAfterGet;" -> "[dcc32 Error] threads.pas(55): E2128 INDEX, READ or WRITE clause expected, but ';' found"
теперь встаем на строчку с этим property и нажимаем Shift + Ctrl +C. Смотрим на "исправленный код"
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.10.2014, 16:09   #18
vahdorf
Пользователь
 
Регистрация: 07.10.2014
Сообщений: 10
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
теперь встаем на строчку с этим property и нажимаем Shift + Ctrl +C. Смотрим на "исправленный код"
Не понял. По нажатию комбинации клавиш перебрасывает на строку "procedure TMyTread.Execute;" с выводом сообщения "Expected ';' but '.' found."
vahdorf вне форума Ответить с цитированием
Старый 13.10.2014, 09:34   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

"раcшифровка" property OnAfterGet
(то что должно было получиться по Shift Ctrl C)
Код:
private
  FprocAterGet: TProcAfterGet;
public
property onAfterGet: TProcAfterGet read FProcAfterGet wrtite FprocAfterGet;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Synchronize, Критические секции, другие варианты, что лучше для синхронизации потоков? bilibian Общие вопросы Delphi 15 04.03.2014 10:57
Проблема синхронизации WinAPI потоков Vadik(R) Общие вопросы Delphi 1 13.01.2014 01:27
AccessVolation при синхронизации потоков hiho Общие вопросы Delphi 2 27.10.2012 08:29
Проблема синхронизации потоков Teor Общие вопросы .NET 4 17.06.2011 15:50
Реализация функций синхронизации потоков. натка Помощь студентам 1 03.01.2008 15:26