Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
Delphi 6-7

Выполнение задачи в нескольких потоках, основные принципы, синхронизация

09.02.2022, 18:58. Показов 2087. Ответов 33

Студворк — интернет-сервис помощи студентам
Тему создал чтобы не флудить в соседней.
Собственно тестовый проект.
Пока интересует вопрос связанный конкретно с вызовом этого кода из потока :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure LoadTXT_Thread.Execute;
var i,j,P,NeedFind,WhereFind,Tasks,STRt,FNSh:Integer;
 t1,t2,freq:Int64;
begin
  { Place thread code here }
   QueryPerformanceFrequency(freq);
    QueryPerformanceCounter(t1);
   NeedFind:=FfindL.Count-1;
   WhereFind:=FStringL.Count-1;
   Tasks:=WhereFind div Cores;
 
   for i:=0 to Cores-1 do
   begin
     STRt:=i*Tasks;
     FNSh:=(i+1)*Tasks;
     if i>0 then STRt:=strt+1;
     if (i=Cores-1) then FNSh:=WhereFind;
   SearchArr[i]:=Search_Thread.Create(Form1.ThreadTerm,FfindL,FStringL,STRt,FNSh,False);
    Log(form1.mmo1,IntToStr(i)+' THread '+IntToStr(STRt)+'--'+IntToStr(FNSh)) ;
   // Log(form1.mmo1,IntToStr(i)+' THread '+IntToStr(STRt)+'--'+IntToStr(FNSh)) ;
   end;
{ for i:=0 to FfindL.Count-1 do
    for j:=0 to FStringL.Count-1 do
     begin
      p:= pos(FfindL[i],FStringL[j]);
      if p>0 then begin
      FCompared.Add(FfindL[i]+' '+FStringL[j]+' ');
         PostMessage(Form1.Handle,MY_PROGRESS,0,Round(i*100/maxx));
       end;
 
     end;  }
      QueryPerformanceCounter(t2);
   Log(form1.mmo1,FormatFloat('0.000000',(t2-t1)/freq)+' Time to start 20 Threads') ;
    Log(form1.mmo1,'----------------------------') ;
    Log(form1.mmo1,IntToStr(Tasks)+' Tasks') ;
    Log(form1.mmo1,IntToStr(NeedFind)+' NeedFind') ;
    Log(form1.mmo1,IntToStr(WhereFind)+' WhereFind') ;
    Log(form1.mmo1,IntToStr(Length(SearchArr))+' Length_Array') ;
   // PostMessage(Form1.Handle,MY_PROGRESS,MY_END_PROGRESS,Handle);
 end;
А именно его вызов без синхронизации в контексте какого потока происходит?
Delphi
1
2
3
4
5
procedure LoadTXT_Thread.Log(var M: TMemo;SS:string);
begin
//
 m.Lines.Add(SS);
end;
Вложения
Тип файла: zip STRING_THR20.zip (283.0 Кб, 5 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2022, 18:58
Ответы с готовыми решениями:

Чтение и выполнение задачи в разных потоках
Здравствуйте, появился такой вопрос, гугление особого точного ответа не дало, вопрос таков, могу ли я выполнять алгоритм во втором потоке...

основные комбинатроные принципы
1. Если авиакомпания осуществляет 15 рейсов из Сан-Франциско в Чикаго и 20 рейсов из Чикаго в Нью-Йорк, то сколько всего рейсов из...

Основные принципы среды С
Все С-системы в общем состоит из 3 частей: среды программирования, собственного языка и стандартой библиотеки С. Вопрос: Что...

33
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
10.02.2022, 16:26
Студворк — интернет-сервис помощи студентам
нормально коррелирует
запись есть некий размеченный кусок памяти, для которого компилятор держит таблицу смещений и размеров для каждого имени поля

при этом не зря же указано ключевое слово PACKED!
потому что если б его не было, то все поля отравнялись бы по УДОБНОМУ размеру
именно, чтобы доступ к памяти был прямой
пишем из регистра по такому-то адресу весь регистр и все...
а для работы с PACKED процессор выполняет гораздо больше работы -
взять 64 бита памяти по адресу XXX
узнать, где там этот байт в этих битах
заполнить по маске ТОЛЬКО его биты
положить все на место

Добавлено через 1 минуту
при описании переменной никаких PACKED не предусмотрено, поэтому они все равно по факту занимают больше места чем byte
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
10.02.2022, 17:24
Цитата Сообщение от krapotkin Посмотреть сообщение
при этом не зря же указано ключевое слово PACKED!
без packed то же самое
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
10.02.2022, 17:40
рили?
Миниатюры
Выполнение задачи в нескольких потоках, основные принципы, синхронизация   Выполнение задачи в нескольких потоках, основные принципы, синхронизация  
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
10.02.2022, 17:55
хз, у меня было одинаково

Добавлено через 6 минут
в общем, запарился я с тестом, неправильно тестировал.

Добавлено через 3 минуты
Цитата Сообщение от DenNik Посмотреть сообщение
хз, у меня было одинаково
это было, когда размер структуры
Delphi
1
2
3
TByteRec = record
  F1,F2,F3,F4: Byte;
end;
был одинаков что с packed, что без
0
10.02.2022, 18:56

Не по теме:

Цитата Сообщение от DenNik Посмотреть сообщение
набиваю руку в плане интерфейсов
Недавно ковырялся с интерфейсами. С ними можно интересную штуку делать - "объединять" объекты, не имеющие общего предка. Т.е., интерфейс будет являться для них чем-то типа базового класса, с базовыми методами, общими для объектов.

0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
10.02.2022, 19:07
Цитата Сообщение от DenNik Посмотреть сообщение
Delphi
1
2
3
TByteRec = record
  F1,F2,F3,F4: Byte;
end;
Действительно, если запись из одних байтов, то в любом случае получается упакованная запись (4 байт). Стоит один из элементов сделать integer, то обычная запись уже становится 12 байт.
0
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
10.02.2022, 19:39  [ТС]
Constcat,
Сделал немного замеров
1 поток 28,7-29,12 сек
10 потоков 3,3-3,6 сек; ускорение 8 раз
20 потоков 2,4-2,55 сек; ускорение 11,41 раз когда они исполняют по 2 потока на ядро,
по факту максимальная нагрузка на ядра
30 потоков 2,2-2.72 сек;
40 потоков 2,42 сек; -1 прогон
80 потоков 2,40 сек; -1 прогон
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
10.02.2022, 19:47

Не по теме:

Constcat, не совсем так.. или совсем не так. Это класс реализует интерфейс, то бишь "имплементирует" его {интерфейса} методы, являющиеся всегда виртуальными и абстрактными и класс может реализовать несколько интерфейсов, "объединяя" их. Но не наоборот.



Добавлено через 2 минуты

Не по теме:

да, несколько классов может реализовать один интерфейс, однако состав методов у них будет одинаков. Разной может быть только реализация

0
10.02.2022, 20:39

Не по теме:

Цитата Сообщение от DenNik Посмотреть сообщение
да, несколько классов может реализовать один интерфейс, однако состав методов у них будет одинаков. Разной может быть только реализация
Интерфейс может определять некий набор методов, которые, разумеется, порожденные классы обязаны реализовать.
Я это о чем. Допустим, у меня есть некий класс, порожденный от TEdit. И некий класс, порожденный от TLabel. Допустим, объекты этого класса хотелось бы объединить в некий массив или список. И чтобы можно было бы вызвать некий общий для этих объектов метод, обращаясь к элементу массива/списка. Ну, как если бы у нас был общий базовый класс для этих двух классов с виртуальным методом.
Например, некий SetText(sText: String), по которому объект TEdit будет изменять свое свойство Text, а объект TLabel - Caption.
И как раз при помощи интерфейсов эту задачу может решить.

0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
10.02.2022, 21:54

Не по теме:

да, идея привлекательная. Только вот у меня фокус со списком интерфейсов не удался. Значит, нужен список объектов. И тут встает задача приведения двух разных классов к одному знаменателю с поддежкой кастомного интерфейса. Хорошая темка для домашней работы)



Добавлено через 18 минут

Не по теме:

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

0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
11.02.2022, 00:27
Цитата Сообщение от DenNik Посмотреть сообщение
хм, я таки решил задачку ) Для этого потребовалось ввести класс-холдер, являющийся элементом списка
Можно еще проще.
Да, с TObjectList ничего не выйдет, потому что TObject не совместим с Interface.
C TList проще, но он хочет Pointer, нужно двойное преобразование.
А вот с массивом все чисто и гладко.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var
 a: array of TMyInterface;
 o1: TInterfacedEdit;
 o2: TInterfacedLabel;
...
begin
  ...
  a[i]:=o1;
  a[j]:=o2;
  ...
  a[n].InterfacedMethod;
end;
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
11.02.2022, 10:50
преобразование происходит только на бумаге, чтоб компилятор понял, что вы от него хотите
всяко лучше чем с массивом работать
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
11.02.2022, 11:11
Мой вариант без преобразований
интерфейсы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
unit UnitIntf;
 
interface
 
uses
  Vcl.StdCtrls, Vcl.ExtCtrls;
 
type
  // рабочий интерфейс
  IControl = interface
    procedure SetValue(const Value: string);
  end;
 
  // контейнер - элемент списка
  TContainer = class(TObject,IControl)
  private
    FControl: IControl;
    function GetControl: IControl;
  public
    constructor Create(Control: IControl);
    // можно имплементировать поддержку интерфейса только
    // одним свойством класса, а не всем классом
    property Control: IControl read GetControl implements IControl;
  end;
 
  TIEdit = class(TEdit,IControl)
  public
    procedure SetValue(const Value: string);
  end;
 
  TILabel = class(TLabel,IControl)
  public
    procedure SetValue(const Value: string);
  end;
 
  TIPanel = class(TPanel,IControl)
  public
    procedure SetValue(const Value: string);
  end;
 
  TIButton = class(TButton,IControl)
  public
    procedure SetValue(const Value: string);
  end;
 
implementation
 
{ TContainer }
 
constructor TContainer.Create(Control: IControl);
begin
  FControl:= Control;
end;
 
function TContainer.GetControl: IControl;
begin
  Result:= FControl;
end;
 
{ TIEdit }
 
procedure TIEdit.SetValue(const Value: string);
begin
  Self.Text:= Value;
end;
 
{ TILabel }
 
procedure TILabel.SetValue(const Value: string);
begin
  Self.Caption:= Value;
end;
 
{ TIPanel }
 
procedure TIPanel.SetValue(const Value: string);
begin
  Self.Caption:= Value;
end;
 
{ TIButton }
 
procedure TIButton.SetValue(const Value: string);
begin
  Self.Caption:= Value;
end;
 
end.

прога
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
unit UnitMain;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Generics.Collections,
  Vcl.StdCtrls, UnitIntf, Vcl.ExtCtrls;
 
type
  // переопределение наследования
  // (подействует только в Ран-Тайм, что нам и нужно)
  TEdit = class(TIEdit);
  TLabel = class(TILabel);
  TButton = class(TIButton);
  TPanel = class(TIPanel);
 
  TfrmMain = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    Button3: TButton;
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    procedure ItemNotify(Sender: TObject; const Item: TContainer;
                         Action: TCollectionNotification);
  end;
 
var
  frmMain: TfrmMain;
  myList: TList<TContainer>;
 
implementation
 
{$R *.dfm}
 
procedure TfrmMain.Button1Click(Sender: TObject);
var
  Item: TContainer;
begin
  // проход по списку
  for Item in myList do Item.Control.SetValue('TEST');
end;
 
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  myList.Free;
end;
 
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  myList:= TList<TContainer>.Create;
  myList.OnNotify:= ItemNotify;
  // формируем список компонентов
  myList.Add(TContainer.Create(Edit1));
  myList.Add(TContainer.Create(Edit2));
  myList.Add(TContainer.Create(Label1));
  myList.Add(TContainer.Create(Label2));
  myList.Add(TContainer.Create(Button2));
  myList.Add(TContainer.Create(Button3));
  myList.Add(TContainer.Create(Panel1));
end;
 
procedure TfrmMain.ItemNotify(Sender: TObject; const Item: TContainer;
  Action: TCollectionNotification);
begin
  // уничтожение элемента списка (не компонента!)
  if Action <> cnAdded then Item.Free;
end;
 
end.
Миниатюры
Выполнение задачи в нескольких потоках, основные принципы, синхронизация  
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
11.02.2022, 11:29
Цитата Сообщение от DenNik Посмотреть сообщение
Мой вариант без преобразований
Класс!
Но можно и без холдера.
Delphi
1
MyList.Add(Pointer(TIEdit.Create));
И вызов
Delphi
1
IControl(MyList[i]).SetValue('TEXT');
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2022, 11:29

Основные принципы Squid!
Подскажите пожалуйста краткий план работы Squid? Для начала хочу разобраться ограничить доступ к определенным сайтам для одного IP. Заранее...

Основные принципы WCF
Доброго времени суток господа. Вот на эту тему нужна в общем литература, и хотелось бы видеть перечисление этих принципов. здесь написано,...

Основные принципы создания грида
Подскажите пожалуйста основные принципы создания грида. Сетка, данные и пр.

Задание основные принципы ООП
Что требуется выполнить: -описать базовый класс Животное (Animal), у которого будут виртуальные методы &quot;говорить&quot;,...

Основные принципы создания плагинов
Какие существуют основные принципы создания плагинов


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru