Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

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

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

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2021, 11:16   #1
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 147
По умолчанию Передать число след. потоку

Код:
constructor TNewThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
end;

procedure TNewThread.Execute;
var
HTTP: TIdHTTP;
id:integer;
begin
  inherited;
while Work do
  begin
  CS.Enter;
CS.Leave;
   if Work then
      begin
      id:=id+1;
     HTTP:=TIdHTTP.create(nil); //Создаём HTTP
     HTTP.HandleRedirects:=false; //Запрещаем редирект
 begin
Rez:=1;
try
http.Get('http://site.com/+inttostr(id));

except

   dec(Thread);
end;

HTTP.Free;
Synchronize(Sync);
  end;
end;

  dec(Thread);
    end;
end;


procedure TNewThread.Sync;
begin
case Rez of
   1:begin
      Form1.Label9.Caption:=IntToStr(StrToInt(Form1.label9.Caption)+1);
    end;
    -1:begin
      Form1.Label2.Caption:=IntToStr(StrToInt(Form1.label2.Caption)+1);
     end;
 end;
end;
Проблема заключается в том что при старте (если указать 3 потока) то три потока сразу начинают работу с одной цифры
то есть
6027
6027
6027
6028
6029
6031
6031
6032
6033
6035
6035
6037
6037
6038
6039
6040
6042
6042

А потом по логике при запуске каждого потока нужно делать + 1 к ID
id:=id+1;

Но получается что числа дублируются!

Как можно отследить начало/заверщение потока и только потом передать след потоку id:=id+1;

Я не особо разбираюсь в программировании может кто подскажет как вообще это правельно сделать!За ранее благодарен!
brownb вне форума Ответить с цитированием
Старый 21.09.2021, 11:59   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,311
По умолчанию

вар 1. создавать потоки СРАЗУ с нужными данными(числами)
написать свой конструктор
Код:
TMyThread =class(...)
private
 FmyID: integer;
public
  constructor Create(..., myID: integer);
end;
constructor TMyThread.Create(..., myID: integer);
  inherited Create(...);
  self.FMyID:=MyID;
end;
Код:
r1:=TMyThread.Create(..., 1);
r2:=TMyThread.Create(..., 10);
...
Вар.2 "научить" поток узнавать нужные данные(числа)
написать свое свойство-событие и реакцию на него.
Код:
TFuncGetMyID =function(sender: TMyThread) :integer of object;
TMyThread =class(...)
private
  FFuncGetMyID: 
public
  property OnGetMyID: TFuncGetMyID;
  procedure Execute; override;
end;
procedure TMyThread.Execute;
begin
...
  myworkID:= FFuncGetMyID(self); // ВЕЗДЕ где надо узнать новый ID
...
end;
Код:
var
   globalID: integer;

function TMyForm.RealGetID: intreger;
begin
  result:=globalID;
  Inc(globalID, 10);
end;


r1:=TMyThread.Create(...);
r1.OnGetMyID:=RealGetID;
Цитата:
Код:
while Work do
  begin
Work --есть глобальная переменная ?
да. конечно.
таким образом вы остановите ВСЕ свои потоки одновременно, вам это и надо ?
нет, хочу остановить только один.
для целей остановки отдельных потоков. существует признак Terminated для операций в потоке и процедура-метод terminate его установки извне
Код:
while not self.terminated do begin
...
end;
Код:
r1:=TmyThread.Create(...);
r2:=TmyThread.Create(...);
Код:
r2.terminate; // остановка потока извне
3.
Цитата:
Код:
    HTTP:=TIdHTTP.create(nil); //Создаём HTTP
если мы создаем(Create) что-то , то мы должны и удалить это (Free) после того как необходимость в нем исчезла
HTTP.Free;
и ровно столько раз сколько будем создавать.
создаем в цикле и удалять надо будет в ЭТОМ же цикле.

на самом деле его достаточно создать ОДИН раз ДО цикла.
и удалить в таком разе после цикла.

4.
"правильный" поток не знает кто его вызвал и как он будет отображать его результаты и ход выполнения.
Для всего этого у потока могут и должны быть разные свойства (значения текущего состояния) и события -извещения об изменениях этого состояния, которыми смогут воспользоваться любые внешние (и неизвестные потоку) объекты.

Код:
property myID: integer read FMyID;
property myrez: integer; read FmyRez;
property OnAfterReadHTTP: TNotfyEvent;
Код:
procedure TMyThread.Sync;
begin
 OnAfterReadHTTP(self);
end;
Код:
r1.OnAfterReadHTTP:=form1.DoAfterRead;
Код:
proceure TForm1.DoAfterRead(sender: TObject);
begin
  r:=sender as TMyThread; //нас известил вот этот поток
  z:=r.myRez;
  x:=r.myID; // и в данный момент его состояние вот такое
  self.Label9.... // а теперь что хотим то и делаем
  ...
end;
P.S.
Цитата:
для целей остановки отдельных потоков. ...
а для извещения об окончании работы потока OnTerminate
пример смотри DoAfterReadHTTP.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.09.2021 в 12:46.
evg_m вне форума Ответить с цитированием
Старый 22.09.2021, 08:41   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,641
По умолчанию

робко спрошу.
если я создавал потоки в цикле for i:=1 to 3 do,
то удалять надо в таком же цикле for i:=1 to 3 do или
в обратном for i:=3 downto 1 do?
просто один раз столкнулся, когда динамические переменные создавал, что выскакивала ошибка, пока не начал циклично удалять с конца списка...он удаляет переменную и сдвигает весь список на 1 позицию в начало. а потом когда доходит до несуществующего элемента - выдаёт ошибку... два дня убил, пока понял...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 22.09.2021, 09:25   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,311
По умолчанию

Цитата:
просто один раз столкнулся, когда динамические переменные создавал
динамические массивы ?
и еще менял их размеры в цикле ?
https://programmersforum.ru/showpost...05&postcount=4
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.09.2021, 11:44   #5
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,641
По умолчанию

нет, только создавал и уничтожал. при использовании размер не менял динамических массивов... просто полез в дебри, куда до селе ни разу не лазил, получилось в итоге, но застопорился на элементарном...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как передать число в другой скрипт Unity marluna C# (си шарп) 4 09.04.2018 22:42
Передать TStrings создаваемому потоку Shouldercannon Общие вопросы Delphi 6 16.01.2014 17:14
Через командную строку передать два слова и целое число N. gas777 Общие вопросы C/C++ 5 23.06.2011 18:59
передать в формулу переменное число аргументов Тупой Microsoft Office Excel 5 29.09.2010 02:15
Каждому клиенту по потоку. ImmortalAlexSan Работа с сетью в Delphi 1 01.07.2010 16:45