Последние записи
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
- Взаимодействие через командную строку
- Сравнение языков на массивах. Часть 1
- Сравнение языков по скорости
- Чтение огромных xml-файлов
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
22nd
Сен
Передать число следующему потоку
Posted by obzor under Delphi
Проблема заключается в том что при старте (если указать 3 потока) то три потока сразу начинают работу с одной цифры.
А потом по логике при запуске каждого потока нужно делать + 1 к ID
id:=id+1;
Но получается что числа дублируются!
Как можно отследить начало/заверщение потока и только потом передать след потоку id:=id+1;
вар 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;
Код:
|
Work —есть глобальная переменная ?
да. конечно.
таким образом вы остановите ВСЕ свои потоки одновременно, вам это и надо ?
нет, хочу остановить только один.
для целей остановки отдельных потоков. существует признак Terminated для операций в потоке и процедура-метод terminate его установки извне
while not self.terminated do begin
...
end;
r1:=TmyThread.Create(...);
r2:=TmyThread.Create(...);
r2.terminate; // остановка потока извне
3.
Код:
|
если мы создаем(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.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)