Вверх ↑
Этот топик читают: Гость
Ответов: 1343
Рейтинг: 31
#1: 2020-09-05 22:48:14 ЛС | профиль | цитата
Посмотрел на исходник компонента поток и ничего не понял, как оно работает...
Как сделать выполнение кода в IC в несколько потоков?
Например заполнили 2 буффера данными для обработки, далее нужно запустить код в 2 потока, что бы данные в обеих буфферах обрабатывались параллельно, а не по порядку.
карма: 2

0
Ответов: 1926
Рейтинг: 172
#2: 2020-09-06 21:07:17 ЛС | профиль | цитата
Как-то так:

Add(InlineCode,9836184,343,322)
{
WorkPoints=#1:a|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|16: th1:PThread;|16: th2:PThread;|47: function Execute1(Sender:PThread): Integer;|47: function Execute2(Sender:PThread): Integer;|9: public|17: //:THI_Event;|0:|42: procedure a(var dt:TData; index:word);|0:|5: end;|0:|14:implementation|0:|24:procedure THiAsmClass.a;|5:begin|79: //Это значит, что при каждом новом вызове метода потоки будут перезапускаться:|32: if Assigned(th1) then th1.Free;|32: if Assigned(th2) then th2.Free;|62: //Если епрезапускать не нужно - вместо th1/2.Free ставим exit|0:|62: th1 := {$ifdef F_P}NewThreadforFPC{$else}NewThread{$endif};|29: th1.OnExecute := Execute1;|14: th1.Resume;|0:|62: th2 := {$ifdef F_P}NewThreadforFPC{$else}NewThread{$endif};|29: th2.OnExecute := Execute2;|14: th2.Resume;|4:end;|0:|31:procedure THiAsmClass.Execute1;|5:begin|15: //первый поток|17: //_hi_OnEvent();|4:end;|0:|31:procedure THiAsmClass.Execute2;|5:begin|15: //второй поток|17: //_hi_OnEvent();|4:end;|0:|4:end.|
}
Уже внутри execute можно repeat поставить, как в компоненте.
А можно сделать array of PThread
карма: 9
0
Ответов: 1343
Рейтинг: 31
#3: 2020-09-07 00:02:30 ЛС | профиль | цитата
3042 писал(а):
Как-то так:




HiAsmUnit.pas(31,21) Error: Incompatible types: got "THiAsmClass.Execute1(PThread):LongInt;" expected "<procedure variable type of function(PThread):Int64 of object;Register>"
HiAsmUnit.pas(35,21) Error: Incompatible types: got "THiAsmClass.Execute2(PThread):LongInt;" expected "<procedure variable type of function(PThread):Int64 of object;Register>"
HiAsmUnit.pas(39,23) Error: function header doesn't match the previous declaration "Execute1(PThread):LongInt;"
HiAsmUnit.pas(45,23) Error: function header doesn't match the previous declaration "Execute2(PThread):LongInt;"
HiAsmUnit.pas(51,4) Fatal: There were 4 errors compiling module, stopping


FPC x64

Редактировалось 3 раз(а), последний 2020-09-07 00:03:50
карма: 2

0
Ответов: 1926
Рейтинг: 172
#4: 2020-09-07 00:55:54 ЛС | профиль | цитата
Странно, у меня компилируется без ошибок. fpc обычный, из AltBuild. Попробуй скомпилировать ещё несколько раз - я замечал, что с первого раза fpc иногда выдаёт ошибки, хотя это тоже непонятно.
карма: 9
0
Ответов: 1343
Рейтинг: 31
#5: 2020-09-07 01:32:51 ЛС | профиль | цитата
3042 писал(а):
Странно, у меня компилируется без ошибок. fpc обычный, из AltBuild. Попробуй скомпилировать ещё несколько раз - я замечал, что с первого раза fpc иногда выдаёт ошибки, хотя это тоже непонятно.


однозначно, нет, ошибки сами по себе не исчезли))), перешёл практически во всём на FPC x64

обычный компилит, а вот от Netspirit'a не хочет

Редактировалось 1 раз(а), последний 2020-09-07 01:38:07
карма: 2

0
Ответов: 1926
Рейтинг: 172
#6: 2020-09-07 06:13:56 ЛС | профиль | цитата

Rysik, procedure THiAsmClass.Execute надо заменить на function THiAsmClass.Execute, т.к. они объявлены как функции. Как это ещё вообще компилировалось...
карма: 9
0
Ответов: 1343
Рейтинг: 31
#7: 2020-09-07 19:34:00 ЛС | профиль | цитата
3042 писал(а):

Rysik, procedure THiAsmClass.Execute надо заменить на function THiAsmClass.Execute, т.к. они объявлены как функции. Как это ещё вообще компилировалось...



воо, пошло поехало, ток ещё тип данных у них поменять на Int64, в FPCx64
карма: 2

0
Ответов: 4628
Рейтинг: 749
#8: 2020-09-08 11:28:44 ЛС | профиль | цитата
Rysik писал(а):
на Int64, в FPCx64

На NativeInt - для всех компиляторов модифицированного пакета.
карма: 26

0
8
Сообщение
...
Прикрепленные файлы
(файлы не залиты)