Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/29: Рейтинг темы: голосов - 29, средняя оценка - 5.00
 Аватар для Sophos
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265

Передача в поток CALLBACK процедуры

06.03.2012, 10:23. Показов 5609. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал потомка TThread под свои нужды:

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
Type
 
 TThreadIO = Class(TThread)
  Private
   FExecuteProc : TProcedure;
  Public
   Constructor Create(Var Proc : TProcedure);
   Procedure Execute; Override;
 End;
 
 TThreadCheck = Class(TThreadIO)
  Private
   FProceed     : Boolean;
   FOldCount    : Integer;
   FNewCount    : Integer;
  Public
   Property Proceed : Boolean  Read FProceed  Write FProceed;
   Property OldCount : Integer Read FOldCount Write FOldCount;
   Property NewCount : Integer Read FNewCount Write FNewCount;
  
   Constructor Create(Var Proc : TProcedure);
   Procedure Execute; Override;
 End;
 
Implementation
 
 { TThreadIO }
 
Constructor TThreadIO.Create(Var Proc : TProcedure);
Begin
 Inherited Create(FALSE);
 
 FExecuteProc    := Proc;
 FreeOnTerminate := TRUE;
End;
 
Procedure TThreadIO.Execute;
Begin
 FExecuteProc;
 Terminate;
End;
 
 { TThreadCheck }
 
 
Constructor TThreadCheck.Create(Var Proc : TProcedure);
Begin
 Inherited Create(Proc);
 
 FProceed     := FALSE;
 FOldCount    := 0;
End;
 
Procedure TThreadCheck.Execute;
Begin
 While (Not Terminated) Do
  Begin
   Sleep(CCL_THREADS_STARTSTOPINTERVAL);
   While FProceed Do
    FExecuteProc;
  End;
End;


Теперь мне надо из описания класса создать поток и передать ему процедуру:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 TThreadedComConnection = Class(TComConnection)
  Private
   FCheckThread     : TThreadCheck;
 
   Procedure ThreadCheck;
 
  Public
 
 End;
 
Constructor TThreadedComConnection.Create;
Begin
 Inherited Create;
 
 FTimeoutInterval  := 0;
 FTimeoutCurrent   := 0;
 SetLength(DataArray, 0);
 FCheckThread := TThreadCheck.Create(ThreadCheck);
End;
Ругается на строку FCheckThread := TThreadCheck.Create(ThreadCheck);, мол не тот тип. Мне нужно присвоить значение callback функцие, чтобы были доступны методы класса.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2012, 10:23
Ответы с готовыми решениями:

Передача callback функции
Всем добрый день! Как описать и реализовать метод OLE класса для принятия обработчика, чтобы тот вызывался в контексте клиентского...

Передача callback в dll
Всем привет. Тема не совсем winapi, но это скорее самая подходящая тема. Есть функция в dll, которая принимает указатель на callback...

Передача вектора в CALLBACK Функцию
Можно ли вот таким образом передавать вектор, используя явное преобразование. В принципе это работает, но чревато ли ошибками? void...

13
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.03.2012, 11:30
Т. е., потоку надо передать на выполнение некоторую процедуру, в которой был доступен этот самый объект потока?
Sophos, например здесь можешь посмотреть. Там у меня набор из трёх процедур Proc1(), Proc2(), Proc3() и я раздаю задания для потоков в виде передачи им на выполнение любой из тех процедур. В каждой такой процедуре доступен тот объект потока, которой её выполняет.
0
 Аватар для Sophos
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 12:37  [ТС]
Я так понял, вы предлагаете в поток передавать не процедуру, а указатель на экземпляр объекта? А потом в потоке делать FObject.ThreadCheck?

Добавлено через 32 минуты
Попробовал, скомпилировалось. Получу прибор, проверю, как работает...
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.03.2012, 15:39
Sophos, если я правильно понял, в качестве аргумента надо передать не обыкновенную процедуру, а метод некоторого класса. Соответственно, в этом методе должны быть доступны свойства и методы экземпляра класса. Тогда здесь, наверное, так и надо делать, как у тебя написано - передавать в конструктор TThreadCheck.Create() через параметр точку входа в метод. Но нужно устранить ошибку с несоответствием типов.
Ошибка возникает из-за аргумента:
Delphi
1
  FCheckThread := TThreadCheck.Create(ThreadCheck);
Потому что аргументом конструктора TThreadCheck.Create() является такой процедурный тип:
Delphi
1
2
type
  TProcedure = procedure;
Но на самом деле передаётся точка входа другого типа:
Delphi
1
2
3
4
5
  TThreadedComConnection = Class(TComConnection)
  ...
    Procedure ThreadCheck;
  ...
  End;
Здесь метод TThreadedComConnection.ThreadCheck() имеет такой тип:
Delphi
1
2
type
  TObjProc = procedure of object;
Соответственно, в класс TThreadIO надо внести такое изменение:
Delphi
1
2
3
4
5
6
type
  TObjProc = procedure of object;
  
  TThreadIO = Class(TThread)
    FExecuteProc : TObjProc;
...
Тогда все заработает так, как было задумано. При инициализации переменной FCheckThread в конструкторе:
Delphi
1
2
3
4
5
6
Constructor TThreadedComConnection.Create;
Begin
...
  FCheckThread := TThreadCheck.Create(ThreadCheck);
...
End;
в конструктор TThreadCheck.Create() будет передана точка входа в метод TThreadedComConnection.ThreadCheck() и для этого метода будет проинициализирована внутренняя переменная Self. Таким образом, в теле метода TThreadedComConnection.ThreadCheck() можно будет работать обычным образом - т. е., можно будет через Self обращаться с экземпляру класса TThreadedComConnection.

Добавлено через 2 часа 20 минут
Возможно, я несколько туманно изложил. В общем, я предлагаю классы подправить так:
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
Type
 TObjProc = procedure of object;
 
 TThreadIO = Class(TThread)
  Private
   FExecuteProc : TObjProc;
  Public
   Constructor Create(Var Proc : TObjProc);
   Procedure Execute; Override;
 End;
 
 TThreadCheck = Class(TThreadIO)
  Private
   FProceed     : Boolean;
   FOldCount    : Integer;
   FNewCount    : Integer;
  Public
   Property Proceed : Boolean  Read FProceed  Write FProceed;
   Property OldCount : Integer Read FOldCount Write FOldCount;
   Property NewCount : Integer Read FNewCount Write FNewCount;
  
   Constructor Create(Var Proc : TObjProc);
   Procedure Execute; Override;
 End;
После этих изменений, в конструкторы TThreadIO.Create() и TThreadCheck.Create() в качестве параметров следует передавать не обыкновенные процедуры, а методы, объявленные в каком-нибудь классе.
0
 Аватар для Sophos
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 16:08  [ТС]
Delphi
1
[DCC Error] ACOMFoxThreaded.pas(134): E2033 Types of actual and formal var parameters must be identical
Delphi
1
FCheckThread := TThreadCheck.Create(FCheckThread);
Что-то не работает оно.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.03.2012, 16:21
Это несоответствие параметров. У нас теперь поменялось описание классов и соответствующим образом надо подправить реализацию методов.
Т. е., в описании имеем:
Delphi
1
2
3
4
5
6
7
8
9
10
11
unit ...;
...
interface
...
 TThreadIO = Class(TThread)
 ...
   //Раньше было так: Constructor Create(Var Proc : TProcedure);
  //Теперь тип параметра Proc поменялся:
   Constructor Create(Var Proc : TObjProc);
 ...
 End;
И в реализации надо для Create() также параметр подправить:
Delphi
1
2
3
4
5
6
7
8
9
...
implementation
...
  //Раньше было так: procedure TThreadIO.Create(Var Proc : TProcedure);
  //Теперь тип параметра Proc поменялся:
  procedure TThreadIO.Create(Var Proc : TObjProc);
  begin 
  ...
  end;
Вот таким образом надо подправить. Как я понял - всё дело в этом было.
И для класса TThreadCheck тоже надо таким образом конструктор подправить.
0
 Аватар для Sophos
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 16:24  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Как я понял - всё дело в этом было.
Я, конечно, идиот, но не настолько:
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
Type
 
 TObjProcedure = Procedure of object;
 
 TThreadIO = Class(TThread)
  Private
   FProc       : TObjProcedure;
  Public
   Constructor Create(Var Proc : TObjProcedure);
   Procedure Execute; Override;
 End;
 
 TThreadCheck = Class(TThreadIO)
  Private
   FProceed     : Boolean;
   FOldCount    : Integer;
   FNewCount    : Integer;
  Public
   Property Proceed : Boolean  Read FProceed  Write FProceed;
   Property OldCount : Integer Read FOldCount Write FOldCount;
   Property NewCount : Integer Read FNewCount Write FNewCount;
  
   Constructor Create(Var Proc : TObjProcedure);// Override;
   Procedure Execute; Override;
 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
Constructor TThreadIO.Create(Var Proc : TObjProcedure);
Begin
 Inherited Create(FALSE);
 
 FProc           := Proc;
 FreeOnTerminate := TRUE;
End;
 
Procedure TThreadIO.Execute;
Begin
 FProc;
 Terminate;
End;
 
 { TThreadCheck }
 
 
Constructor TThreadCheck.Create(Var Proc : TObjProcedure);
Begin
 Inherited Create(Proc);
 
 FProceed     := FALSE;
 FOldCount    := 0;
End;
 
Procedure TThreadCheck.Execute;
Begin
 While (Not Terminated) Do
  Begin
   Sleep(CCL_THREADS_STARTSTOPINTERVAL);
   While FProceed Do
    FProc;
   End;
End;
Добавлено через 1 минуту
И да, я выше опечатался, пишу так:
Delphi
1
FCheckThread := TThreadCheck.Create(ThreadCheck);
ThreadCheck так:
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
 TThreadedComConnection = Class(TComConnection)
  Private
   FReadThread      : TThreadIO;
   FWriteThread     : TThreadIO;
   FCheckThread     : TThreadCheck;
   FTimeoutInterval : Integer;
   FTimeoutCurrent  : Integer;
 
   Procedure ThreadRead;
   Procedure ThreadWrite;
   Procedure ThreadCheck;
   Procedure ReadCom;
  Public
   DataArray : Array of Byte;
 
   Constructor Create; //Override;
   Destructor Destroy; Override;
 
   Procedure StartCheck;
   Procedure StopCheck;
   { Don`t use SetTimeout before overriding the TimeoutSignal }
   Procedure SetTimeout(Milliseconds : Integer);
   Procedure Write;
   { Signals }
   Procedure TimeoutSignal; Virtual; Abstract;
   Procedure ReadSignal; Virtual;
 End;
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.03.2012, 16:30
Цитата Сообщение от Sophos Посмотреть сообщение
Я, конечно, идиот, но не настолько:
Кстати, идиот - это греческое слово и в нём нет ничего обидного. Оно означает - "наш человек".
Sophos, надо в коде посмотреть - если где то есть вызов конструктора, и в качестве параметра ему передаётся обыкновенная процедура - то там будет ошибка. Теперь в качестве параметра во всех местах надо передавать именно метод какого-нибудь класса. Т. е. если есть какие-то самостоятельные процедуры, которые должны выполняться в потоках - их надо оформить в виде методов.
0
 Аватар для Sophos
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 16:33  [ТС]
Т. е. если есть какие-то самостоятельные процедуры
На весь модуль у меня нет ни одной самостоятельной процедуры.


Цитата Сообщение от Mawrat Посмотреть сообщение
Оно означает - "наш человек"
Стал бы я себя оскорблять


Цитата Сообщение от Mawrat Посмотреть сообщение
если где то есть вызов конструктора
Он происходит только в одном месте кода. Так же есть три аналогичных куска, где такой коструктор вызывается для Read и Write потоков. Так же ругань. ТАк же отправляется аналогичная процедура:
Delphi
1
2
3
4
5
6
7
8
9
Procedure TThreadedComConnection.ReadCom;
Begin
 FReadThread := TThreadIO.Create(ThreadRead);
End;
 
Procedure TThreadedComConnection.Write;
Begin
 FWriteThread := TThreadIO.Create(ThreadWrite);
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
 TThreadedComConnection = Class(TComConnection)
  Private
   FReadThread      : TThreadIO;
   FWriteThread     : TThreadIO;
   FCheckThread     : TThreadCheck;
   FTimeoutInterval : Integer;
   FTimeoutCurrent  : Integer;
 
   Procedure ThreadRead; // ОНИ
   Procedure ThreadWrite; // ОНИ
   Procedure ThreadCheck; // ОНИ
   Procedure ReadCom;
  Public
   DataArray : Array of Byte;
 
   Constructor Create; //Override;
   Destructor Destroy; Override;
 
   Procedure StartCheck;
   Procedure StopCheck;
   { Don`t use SetTimeout before overriding the TimeoutSignal }
   Procedure SetTimeout(Milliseconds : Integer);
   Procedure Write;
   { Signals }
   Procedure TimeoutSignal; Virtual; Abstract;
   Procedure ReadSignal; Virtual;
 End;
Code
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
Checking project dependencies...
Compiling TestProject.dproj (Debug, Win32)
dcc command line for "TestProject.dpr"
  c:\program files\embarcadero\rad studio\8.0\bin\dcc32.exe -$O- -$W+ --no-config -M -Q -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE 
  -DDEBUG -E.\Debug\Win32 -I"c:\program files\embarcadero\rad studio\8.0\lib\Win32\release";"C:\Documents and Settings\lexa3\Мои документы\RAD 
  Studio\8.0\Imports";"c:\program files\embarcadero\rad studio\8.0\Imports";"C:\Documents and Settings\All Users\Документы\RAD Studio\8.0\Dcp";
  "c:\program files\embarcadero\rad studio\8.0\include";"C:\Program Files\Raize\CS4\Lib\RS-XE";"c:\program files\embarcadero\rad 
  studio\8.0\RaveReports\Lib";"C:\Program Files\FastReports\FastReport 4\LibD15";D:\ACProjects\KLibrary\KDomain\KSimpleDomainObjects;
  D:\ACProjects\KLibrary\KUtilities\RegExpr;D:\ACProjects\KLibrary\KArrayTypes;D:\ACProjects\KLibrary\KMath;"D:\ACProjects\nrComm Lib\Source";
  "D:\ACProjects\nrComm Lib\Delphi13";D:\ACProjects\KLibrary\KComponents\KSimpleSettingsManager\Source;
  D:\ACProjects\KLibrary\KComponents\KSoftWareControlsPackage;D:\ACProjects\KLibrary\KRoutines;D:\ACProjects\KLibrary\KComponents\KInfoEdit;
  D:\ACProjects\miniCalibrator\Software\Library\KCalibratiosListWidget;D:\ACProjects\KLibrary\KUtilities\USB;
  D:\ACProjects\KLibrary\KComponents\KStatusProgressBar;D:\ACProjects\KLibrary\KDeviceRoutines\KProtocols;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageTypes;D:\ACProjects\KLibrary\KDeviceRoutines\KConcreatePackageExtractors\KUS02PackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageSenders;D:\ACProjects\KLibrary\KDeviceRoutines\KMultiConnectionManager;
  D:\ACProjects\KLibrary\KUtilities\ROMBurnRoutines;D:\ACProjects\KLibrary\KDeviceRoutines\KPackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KConcreateDataGetters;D:\ACProjects\KLibrary\KDeviceRoutines\KDeviceDataGetters;
  D:\ACProjects\KLibrary\KComponents\KAnisochronousCommPort;D:\ACProjects\KLibrary\KForms\ComNameSettingsForm;
  D:\ACProjects\KLibrary\KUtilities\KLogManager;D:\ACProjects\ALibrary;D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\InterfacePackage;
  D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\DeviceRoutinesPackage;D:\ACProjects\ALibrary\Components\TCheckGrid;
  D:\ACProjects\COMFox -LE"C:\Documents and Settings\All Users\Документы\RAD Studio\8.0\Bpl" -LN"C:\Documents and Settings\All Users\Документы\RAD 
  Studio\8.0\Dcp" -N0.\Debug\Win32 -O"c:\program files\embarcadero\rad studio\8.0\lib\Win32\release";"C:\Documents and Settings\lexa3\Мои документы\RAD 
  Studio\8.0\Imports";"c:\program files\embarcadero\rad studio\8.0\Imports";"C:\Documents and Settings\All Users\Документы\RAD Studio\8.0\Dcp";
  "c:\program files\embarcadero\rad studio\8.0\include";"C:\Program Files\Raize\CS4\Lib\RS-XE";"c:\program files\embarcadero\rad 
  studio\8.0\RaveReports\Lib";"C:\Program Files\FastReports\FastReport 4\LibD15";D:\ACProjects\KLibrary\KDomain\KSimpleDomainObjects;
  D:\ACProjects\KLibrary\KUtilities\RegExpr;D:\ACProjects\KLibrary\KArrayTypes;D:\ACProjects\KLibrary\KMath;"D:\ACProjects\nrComm Lib\Source";
  "D:\ACProjects\nrComm Lib\Delphi13";D:\ACProjects\KLibrary\KComponents\KSimpleSettingsManager\Source;
  D:\ACProjects\KLibrary\KComponents\KSoftWareControlsPackage;D:\ACProjects\KLibrary\KRoutines;D:\ACProjects\KLibrary\KComponents\KInfoEdit;
  D:\ACProjects\miniCalibrator\Software\Library\KCalibratiosListWidget;D:\ACProjects\KLibrary\KUtilities\USB;
  D:\ACProjects\KLibrary\KComponents\KStatusProgressBar;D:\ACProjects\KLibrary\KDeviceRoutines\KProtocols;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageTypes;D:\ACProjects\KLibrary\KDeviceRoutines\KConcreatePackageExtractors\KUS02PackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageSenders;D:\ACProjects\KLibrary\KDeviceRoutines\KMultiConnectionManager;
  D:\ACProjects\KLibrary\KUtilities\ROMBurnRoutines;D:\ACProjects\KLibrary\KDeviceRoutines\KPackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KConcreateDataGetters;D:\ACProjects\KLibrary\KDeviceRoutines\KDeviceDataGetters;
  D:\ACProjects\KLibrary\KComponents\KAnisochronousCommPort;D:\ACProjects\KLibrary\KForms\ComNameSettingsForm;
  D:\ACProjects\KLibrary\KUtilities\KLogManager;D:\ACProjects\ALibrary;D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\InterfacePackage;
  D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\DeviceRoutinesPackage;D:\ACProjects\ALibrary\Components\TCheckGrid;
  D:\ACProjects\COMFox -R"c:\program files\embarcadero\rad studio\8.0\lib\Win32\release";"C:\Documents and Settings\lexa3\Мои документы\RAD 
  Studio\8.0\Imports";"c:\program files\embarcadero\rad studio\8.0\Imports";"C:\Documents and Settings\All Users\Документы\RAD Studio\8.0\Dcp";
  "c:\program files\embarcadero\rad studio\8.0\include";"C:\Program Files\Raize\CS4\Lib\RS-XE";"c:\program files\embarcadero\rad 
  studio\8.0\RaveReports\Lib";"C:\Program Files\FastReports\FastReport 4\LibD15";D:\ACProjects\KLibrary\KDomain\KSimpleDomainObjects;
  D:\ACProjects\KLibrary\KUtilities\RegExpr;D:\ACProjects\KLibrary\KArrayTypes;D:\ACProjects\KLibrary\KMath;"D:\ACProjects\nrComm Lib\Source";
  "D:\ACProjects\nrComm Lib\Delphi13";D:\ACProjects\KLibrary\KComponents\KSimpleSettingsManager\Source;
  D:\ACProjects\KLibrary\KComponents\KSoftWareControlsPackage;D:\ACProjects\KLibrary\KRoutines;D:\ACProjects\KLibrary\KComponents\KInfoEdit;
  D:\ACProjects\miniCalibrator\Software\Library\KCalibratiosListWidget;D:\ACProjects\KLibrary\KUtilities\USB;
  D:\ACProjects\KLibrary\KComponents\KStatusProgressBar;D:\ACProjects\KLibrary\KDeviceRoutines\KProtocols;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageTypes;D:\ACProjects\KLibrary\KDeviceRoutines\KConcreatePackageExtractors\KUS02PackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageSenders;D:\ACProjects\KLibrary\KDeviceRoutines\KMultiConnectionManager;
  D:\ACProjects\KLibrary\KUtilities\ROMBurnRoutines;D:\ACProjects\KLibrary\KDeviceRoutines\KPackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KConcreateDataGetters;D:\ACProjects\KLibrary\KDeviceRoutines\KDeviceDataGetters;
  D:\ACProjects\KLibrary\KComponents\KAnisochronousCommPort;D:\ACProjects\KLibrary\KForms\ComNameSettingsForm;
  D:\ACProjects\KLibrary\KUtilities\KLogManager;D:\ACProjects\ALibrary;D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\InterfacePackage;
  D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\DeviceRoutinesPackage;D:\ACProjects\ALibrary\Components\TCheckGrid;
  D:\ACProjects\COMFox -U"c:\program files\embarcadero\rad studio\8.0\lib\Win32\release";"C:\Documents and Settings\lexa3\Мои документы\RAD 
  Studio\8.0\Imports";"c:\program files\embarcadero\rad studio\8.0\Imports";"C:\Documents and Settings\All Users\Документы\RAD Studio\8.0\Dcp";
  "c:\program files\embarcadero\rad studio\8.0\include";"C:\Program Files\Raize\CS4\Lib\RS-XE";"c:\program files\embarcadero\rad 
  studio\8.0\RaveReports\Lib";"C:\Program Files\FastReports\FastReport 4\LibD15";D:\ACProjects\KLibrary\KDomain\KSimpleDomainObjects;
  D:\ACProjects\KLibrary\KUtilities\RegExpr;D:\ACProjects\KLibrary\KArrayTypes;D:\ACProjects\KLibrary\KMath;"D:\ACProjects\nrComm Lib\Source";
  "D:\ACProjects\nrComm Lib\Delphi13";D:\ACProjects\KLibrary\KComponents\KSimpleSettingsManager\Source;
  D:\ACProjects\KLibrary\KComponents\KSoftWareControlsPackage;D:\ACProjects\KLibrary\KRoutines;D:\ACProjects\KLibrary\KComponents\KInfoEdit;
  D:\ACProjects\miniCalibrator\Software\Library\KCalibratiosListWidget;D:\ACProjects\KLibrary\KUtilities\USB;
  D:\ACProjects\KLibrary\KComponents\KStatusProgressBar;D:\ACProjects\KLibrary\KDeviceRoutines\KProtocols;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageTypes;D:\ACProjects\KLibrary\KDeviceRoutines\KConcreatePackageExtractors\KUS02PackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KPackageSenders;D:\ACProjects\KLibrary\KDeviceRoutines\KMultiConnectionManager;
  D:\ACProjects\KLibrary\KUtilities\ROMBurnRoutines;D:\ACProjects\KLibrary\KDeviceRoutines\KPackageExtractor;
  D:\ACProjects\KLibrary\KDeviceRoutines\KConcreateDataGetters;D:\ACProjects\KLibrary\KDeviceRoutines\KDeviceDataGetters;
  D:\ACProjects\KLibrary\KComponents\KAnisochronousCommPort;D:\ACProjects\KLibrary\KForms\ComNameSettingsForm;
  D:\ACProjects\KLibrary\KUtilities\KLogManager;D:\ACProjects\ALibrary;D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\InterfacePackage;
  D:\ACProjects\miniCalibrator\MiniCalibratorCheckUtility\source\DeviceRoutinesPackage;D:\ACProjects\ALibrary\Components\TCheckGrid;
  D:\ACProjects\COMFox -K00400000 -NB"C:\Documents and Settings\All Users\Документы\RAD Studio\8.0\Dcp" -NH"C:\Documents and Settings\All 
  Users\Документы\RAD Studio\8.0\hpp" -NO.\Debug\Win32   TestProject.dpr   
[DCC Error] ACOMFoxThreaded.pas(132): E2033 Types of actual and formal var parameters must be identical
[DCC Error] ACOMFoxThreaded.pas(187): E2033 Types of actual and formal var parameters must be identical
[DCC Error] ACOMFoxThreaded.pas(192): E2033 Types of actual and formal var parameters must be identical
[DCC Fatal Error] F2063 Could not compile used unit 'ACOMFoxThreaded.pas'
Failed
Elapsed time: 00:00:00.4
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.03.2012, 16:49
Цитата Сообщение от Sophos Посмотреть сообщение
Стал бы я себя оскорблять
Да я просто, раз фраза подвернулась, решил о происхождении слова поведать.
---
Цитата Сообщение от Sophos Посмотреть сообщение
Он происходит только в одном месте кода. Так же есть три аналогичных куска, где такой коструктор вызывается
Кажется ясно в чём дело... Sophos, в конструкторах надо при объявлении параметра убрать спецификатор VAR:
заменить:
Delphi
1
  TThreadCheck.Create(Var Proc : TObjProcedure);
на:
Delphi
1
  TThreadCheck.Create(Proc : TObjProcedure);
Таким же образом надо подправить в классе TThreadIO.
0
 Аватар для Sophos
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 17:18  [ТС]
Хм. Скомпилилось. Правда не работает, но это уже надо думать.

Работает, спасибо!
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.03.2012, 17:25
В конструкторе запуск потока происходит раньше того момента, когда устанавливается точка входа в процедуру, которую надо выполнять.
Предлагаю конструктор подправить так:
Delphi
1
2
3
4
5
6
7
8
Constructor TThreadIO.Create(Proc : TProcedure);
Begin
 Inherited Create(True);
 
 FExecuteProc    := Proc;
 FreeOnTerminate := TRUE;
 Resume;
End;
Цитата Сообщение от Sophos Посмотреть сообщение
Работает, спасибо!
Хорошо.
0
 Аватар для Sophos
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 17:37  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Resume;
Resume уже сто лет как deprecated.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.03.2012, 17:51
Цитата Сообщение от Sophos Посмотреть сообщение
Resume уже сто лет как deprecated.
У меня Dellphi 7 - там это нормально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2012, 17:51
Помогаю со студенческими работами здесь

Передача указателя на CALLBACK функцию
делаю класс приложения для более быстрого создания программ и просто инкапсуляции всего и вся)) и вот я сделал класс cApplication, один...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

Перенос процедуры из события в поток
Здравствуйте, уважаемые! С написание простейших программ сталкиваюсь крайне редко, но бывает. И сегодня мне нужна Ваша помощь. Сделал...

Дополнительный поток и внешние функции\процедуры
Приветствую Вас, победители восставших компиляторов. Возник небольшой вопрос, в проге есть вспомогательные модули, ну и соответственно...

Синхронизация анонимной процедуры, переданной в поток
Несколько дней назад узнал, что Delphi может анонимные процедуры. И при замене кое-какого кода с потоками на использование таких процедур...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru