------------ Дoбавленo в 13.54:
1nd1g0, вот, эти указатели не работают, а у nesco работают. Правда я не уверен, что они нужны. В инете в примерах их нигде нет.
Add(MainForm,16392125,161,91)
{
Height=393
Color=-16777215
Position=1
link(onCreate,1669216:in1,[])
}
Add(InlineCode,1669216,224,105)
{
@Hint=#21:+ InterlockedExchange|
@Color=11184725
WorkPoints=#3:in1|
EventPoints=#4:out1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|83: CriticalSection: TRTLCriticalSection; //глобальная переменная критической секции|13: r:Integer;|0:|9: public|27: out1:THI_Event; //выход|3: |55: procedure in1(var Data:TData; index:word); // Вход 1|0:|4:end;|0:|14:implementation|0:|34:procedure THiAsmClass.in1; // Вход|0:|0:|38: var Arr: array[1..2] of Integer; |5:begin|0:|13: r := 5;|18: arr[1] := 0;|23://Критические секции |8: |32: //before the threads starts|49: InitializeCriticalSection(CriticalSection^);|5: |0:|6: |26: //in the thread 1 |48: EnterCriticalSection(CriticalSection^); |8: |18: inc(r); |23: inc(arr[1]); |10: |47: LeaveCriticalSection(CriticalSection^);|8: |48: _hi_OnEvent(out1, 'CriticalSection 1'); |29: _hi_OnEvent(out1, r);|34: _hi_OnEvent(out1, arr[1]);|0:|0:|0:|9: |26: //in the thread 2 |47: EnterCriticalSection(CriticalSection); |8: |18: inc(r); |23: inc(arr[1]); |10: |46: LeaveCriticalSection(CriticalSection);|14: |48: _hi_OnEvent(out1, 'CriticalSection 2'); |29: _hi_OnEvent(out1, r);|34: _hi_OnEvent(out1, arr[1]);|0:|5: |4:end;|0:|0:|4:end.|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|
link(out1,3351350:doAdd,[])
AddHint(-164,46,125,13,@Hint)
}
Add(ListBox,3351350,287,105)
{
Left=20
Top=20
Width=360
Height=325
}
Вот код в котором критическую секцию criticalsection8:TRTLCriticalSection; приходится инициализировать каждый раз:
#pas
unit hiFTCG_Tools_8EA9290;
interface
uses windows,kol,Share,hiFTCG_Tools_EM,ftcg_share;
type
TClassFTCG_Tools_8EA9290 = class(TFTCG_Tools_EM)
private
val1:integer;
name_x2:integer;
result16:integer;
result26:integer;
criticalsection8:TRTLCriticalSection;
result18:integer;
result28:integer;
result38:integer;
result1x12:integer;
result2x12:integer;
result3x12:integer;
result4x12:integer;
result5x12:integer;
result6x12:integer;
result7x12:integer;
result8x12:integer;
result9x12:integer;
val15:integer;
name_x18:integer;
val20:integer;
name_x23:integer;
val24:string;
result128:integer;
result1x30:string;
result2x30:string;
result3x30:string;
result134:integer;
result234:integer;
resultat37:real;
val40:string;
resultat41:real;
result1x42:string;
result2x42:string;
result3x42:string;
result4x42:string;
result5x42:string;
result6x42:string;
result7x42:string;
result8x42:string;
result9x42:string;
result144:integer;
result244:integer;
result344:integer;
res49:real;
result1x50:integer;
result2x50:integer;
result3x50:integer;
result4x50:integer;
result5x50:integer;
result6x50:integer;
result7x50:integer;
result8x50:integer;
result9x50:integer;
val57:integer;
name_x58:integer;
val59:integer;
name_x60:integer;
val61:integer;
name_x62:integer;
val63:integer;
name_x64:integer;
val65:integer;
name_x66:integer;
val67:integer;
name_x68:integer;
val69:integer;
name_x70:integer;
val71:integer;
name_x72:integer;
val73:integer;
name_x74:integer;
res81:real;
name_x82:integer;
resultat83:real;
name_x84:integer;
val85:integer;
i86:integer;
resultat87:real;
name_x88:integer;
val92:integer;
resultat93:integer;
val103:real;
result1109:integer;
result2109:integer;
val110:real;
result1x111:real;
result2x111:real;
arr114:array of array of real;
val116:real;
result1x117:string;
result2x117:string;
result3x117:string;
result4x117:string;
result5x117:string;
result6x117:string;
result7x117:string;
result8x117:string;
result9x117:string;
name_x118:integer;
resultat119:real;
name_x120:integer;
result1122:integer;
result2122:integer;
result3122:integer;
val125:integer;
val127:integer;
result1x128:integer;
result2x128:integer;
result3x128:integer;
result4x128:integer;
result5x128:integer;
result6x128:integer;
result7x128:integer;
result8x128:integer;
result9x128:integer;
name_x129:integer;
resultat130:integer;
name_x131:integer;
resultat132:integer;
val134:integer;
resultat135:integer;
name_x136:integer;
name_x137:integer;
resultat138:integer;
name_x139:integer;
resultat140:integer;
name_x142:integer;
resultat143:integer;
name_x145:integer;
resultat146:integer;
resultat147:integer;
val151:integer;
res153:real;
val156:integer;
val160:integer;
res162:real;
val165:integer;
resultat167:integer;
result1x172:integer;
result2x172:integer;
result3x172:integer;
result4x172:integer;
result5x172:integer;
result6x172:integer;
result7x172:integer;
result8x172:integer;
result9x172:integer;
resultat176:real;
resultat179:real;
val183:integer;
result1184:integer;
result2184:integer;
result1185:integer;
val188:real;
result1x189:string;
result2x189:string;
result3x189:string;
result4x189:string;
result5x189:string;
result6x189:string;
result7x189:string;
result8x189:string;
result9x189:string;
name_x190:integer;
result1x191:real;
result2x191:real;
val195:integer;
val197:real;
result1x198:real;
result2x198:real;
res200:real;
val202:integer;
val203:real;
result1x204:real;
result2x204:real;
val208:real;
result1x209:real;
result2x209:real;
val210:real;
val211:real;
result1x212:real;
result2x212:real;
val213:real;
result1x214:real;
result2x214:real;
result1x215:real;
result2x215:real;
ArrayTrack:array of array of array of string;
ArrayItem:array of array of array of array of integer;
ArrayProject:array of array of string;
function readData(index:word):TData;
function readDataInt(index:word):integer;
function readDataStr(index:word):string;
function readDataReal(index:word):real;
public
constructor Create(_Control:PControl);
destructor Destroy; override;
procedure event_doTimer(var Data:TData; index:word);
procedure event_doGvr(var Data:TData; index:word);
procedure event_doEvent1(var Data:TData; index:word);
procedure event_doStart(var Data:TData; index:word);
procedure event_doSort(var Data:TData; index:word);
procedure data_ColorSetki(var Data:TData; index:word);
end;
function Create_hiFTCG_Tools_8EA9290(Control:PControl):TFTCG_Tools_EM;
implementation
uses hiFTCG_Tools;
function Create_hiFTCG_Tools_8EA9290;
begin
Result := TClassFTCG_Tools_8EA9290.Create(Control);
end;
constructor TClassFTCG_Tools_8EA9290.Create;
begin
inherited Create(_Control);
SetLength(doWork, 5);
SetLength(getVar, 1);
doWork[0] := event_doTimer;
doWork[1] := event_doGvr;
doWork[2] := event_doEvent1;
doWork[3] := event_doStart;
doWork[4] := event_doSort;
getVar[0] := data_ColorSetki;
val1 := 0;
name_x2:=str2int('');
val15 := 0;
name_x18:=str2int('');
val20 := 0;
name_x23:=str2int('');
val24 := '';
val40 := '';
val57 := 0;
name_x58:=str2int('');
val59 := 0;
name_x60:=str2int('');
val61 := 0;
name_x62:=str2int('');
val63 := 0;
name_x64:=str2int('');
val65 := 0;
name_x66:=str2int('');
val67 := 0;
name_x68:=str2int('');
val69 := 0;
name_x70:=str2int('');
val71 := 0;
name_x72:=str2int('');
val73 := 0;
name_x74:=str2int('');
name_x82:=str2int('');
name_x84:=str2int('');
val85 := 0;
name_x88:=str2int('');
val92 := 2310753;
val103 := 0;
val110 := 0;
val116 := 0;
name_x118:=str2int('');
name_x120:=str2int('');
val125 := 0;
val127 := 0;
name_x129:=str2int('');
name_x131:=str2int('');
val134 := 0;
name_x136:=str2int('');
name_x137:=str2int('');
name_x139:=str2int('');
name_x142:=str2int('');
name_x145:=str2int('');
val151 := 0;
val156 := 0;
val160 := 0;
val165 := 0;
val183 := 0;
val188 := 0;
name_x190:=str2int('');
val195 := 0;
val197 := 0;
val202 := 0;
val203 := 0;
val208 := 0;
val210 := 0;
val211 := 0;
val213 := 0;
end;
destructor TClassFTCG_Tools_8EA9290.Destroy;
begin
inherited Destroy;
end;
function TClassFTCG_Tools_8EA9290.readData;
begin
dtNull(Result);
_ReadData(Result, THIFTCG_Tools(FParent).Datas[index]);
end;
function TClassFTCG_Tools_8EA9290.readDataInt;
var dt:TData;
begin
dtNull(dt);
_ReadData(dt, THIFTCG_Tools(FParent).Datas[index]);
Result := ToInteger(dt);
end;
function TClassFTCG_Tools_8EA9290.readDataStr;
var dt:TData;
begin
dtNull(dt);
_ReadData(dt, THIFTCG_Tools(FParent).Datas[index]);
Result := ToString(dt);
end;
function TClassFTCG_Tools_8EA9290.readDataReal;
var dt:TData;
begin
dtNull(dt);
_ReadData(dt, THIFTCG_Tools(FParent).Datas[index]);
Result := ToReal(dt);
end;
procedure TClassFTCG_Tools_8EA9290.event_doTimer(var Data:TData; index:word);
var
i5:integer;
i7:integer;
begin
result26:= Length(ArrayTrack[0]) - 1;
for i5 := 1 to result26 do
begin
InitializeCriticalSection(criticalsection8);
result38:= Length(ArrayItem[0,0]) - 1;
for i7 := 1 to result38 do
begin
{$A+}
InterLockedExchange(result1x12, ArrayItem[1,i5,i7,0]);
if result1x12 <> str2int('1') then
begin
{$A+}
InterLockedExchange(result2x12, ArrayItem[1,i5,i7,1]);
val15 := result2x12;
val1 := ToInteger(Data);
name_x2:=val1;
if val15 <= name_x2 then
begin
{$A+}
InterLockedExchange(result3x12, ArrayItem[1,i5,i7,2]);
val20 := result3x12;
if val20 >= name_x2 then
begin
end;
end;
end;
end;
end;
end;
procedure TClassFTCG_Tools_8EA9290.event_doGvr(var Data:TData; index:word);
var
i38:integer;
i46:integer;
i47:integer;
begin
result128 := 1+1;
SetLength(ArrayProject,result128,3);
ArrayProject[1,0] := '129';
result134 := 1+1;
result234 := 64+1;
SetLength(ArrayTrack,result134,result234,9);
Randomize;
result234:= Length(ArrayTrack[0]) - 1;
for i38 := 1 to result234 do
begin
resultat37 := (random(100)) + 0.25;
val40 := double2str(resultat37);
resultat41 := random(3) + 0.25;
ArrayTrack[1,i38,6] := double2str(resultat41);
ArrayTrack[1,i38,7] := val40;
end;
Randomize;
//Init критической секции
InitializeCriticalSection(CriticalSection8);
//Старт критической секции
EnterCriticalSection(CriticalSection8);
result144 := 1+1;
result244 := 64+1;
result344 := 100+1;
SetLength(ArrayItem,result144,result244,result344,9);
//Конец критической секции
LeaveCriticalSection(CriticalSection8);
result244:= Length(ArrayItem[0]) - 1;
for i46 := 1 to result244 do
begin
result344:= Length(ArrayItem[0,0]) - 1;
for i47 := 1 to result344 do
begin
res49 := (i47 * 4 + i46);
{$A+}
InterLockedExchange(ArrayItem[1,i46,i47,0], round(0));
{$A+}
InterLockedExchange(ArrayItem[1,i46,i47,1], round(res49));
{$A+}
InterLockedExchange(ArrayItem[1,i46,i47,2], round(2));
end;
end;
val24 := ToString(Data);
end;
procedure TClassFTCG_Tools_8EA9290.event_doEvent1(var Data:TData; index:word);
begin
end;
procedure TClassFTCG_Tools_8EA9290.event_doStart(var Data:TData; index:word);
var
i89:integer;
i108:integer;
i121:integer;
begin
val57 := ToInteger(readData(0));
name_x18:=val57;
val59 := ToInteger(readData(1));
name_x23:=val59;
val61 := ToInteger(readData(2));
name_x58:=val61;
val63 := ToInteger(readData(3));
name_x60:=val63;
val65 := 1;
name_x62:=val65;
val67 := ToInteger(readData(4));
name_x64:=val67;
val69 := ToInteger(readData(5));
name_x66:=val69;
val71 := ToInteger(readData(6));
name_x68:=val71;
val73 := ToInteger(readData(7));
name_x70:=val73;
res81 := name_x18 * 4;
resultat83 := (frac(name_x68 / res81) * res81) - res81;
val85 := round(resultat83);
if i86 = 0 then
begin
_hi_onEvent(THIFTCG_Tools(FParent).Events[3], val85);
end
else
begin
end;
resultat87 := (name_x23 / name_x18) / 2;
for i89 := 1 to round(resultat87) do
begin
val92 := 4539717;
resultat93 := name_x18 + val85;
val85 := resultat93;
if i86 = 0 then
begin
_hi_onEvent(THIFTCG_Tools(FParent).Events[3], val85);
end
else
begin
end;
val92 := 3427130;
resultat93 := name_x18 + val85;
val85 := resultat93;
if i86 = 0 then
begin
_hi_onEvent(THIFTCG_Tools(FParent).Events[3], val85);
end
else
begin
end;
val92 := 4539717;
resultat93 := name_x18 + val85;
val85 := resultat93;
if i86 = 0 then
begin
_hi_onEvent(THIFTCG_Tools(FParent).Events[3], val85);
end
else
begin
end;
val92 := 2310753;
resultat93 := name_x18 + val85;
val85 := resultat93;
if i86 = 0 then
begin
_hi_onEvent(THIFTCG_Tools(FParent).Events[3], val85);
end
else
begin
end;
end;
i86 := 1;
val85 := 0;
if i86 = 0 then
begin
_hi_onEvent(THIFTCG_Tools(FParent).Events[3], val85);
end
else
begin
end;
i86 := 0;
val103 := 0;
result2109:= Length(ArrayTrack[0]) - 1;
for i108 := 1 to result2109 do
begin
result1x111:= arr114[i108,0];
val110 := result1x111;
result7x117:= ArrayTrack[name_x62,round(val110),6];
val116 := str2double(result7x117);
resultat119 := round(val103 + (name_x60 * val116));
val103 := resultat119;
result3122:= Length(ArrayItem[0,0]) - 1;
for i121 := 1 to result3122 do
begin
val125 := 0;
{$A+}
InterLockedExchange(result3x128, ArrayItem[name_x62,i108,i121,2]);
val127 := result3x128;
resultat130 := (val127 * name_x18) + 1;
resultat132 := round(name_x60 * val116) + 1;
{$A+}
InterLockedExchange(result2x128, ArrayItem[name_x62,i108,i121,1]);
val134 := result2x128;
resultat135 := (name_x18 * val134) - name_x18 + name_x68;
resultat138 := round(resultat119 - (name_x60 * val116)) + name_x70;
resultat140 := max(0, name_x23);
resultat143 := max(0, name_x58);
resultat146 := min(0, name_x23);
resultat147 := min(0, name_x58);
if resultat140 < resultat135 then
begin
val151 := 1;
end
else
begin
val151 := 0;
end;
res153 := (resultat135 + resultat130);
if resultat146 > round(res153) then
begin
val156 := 1;
end
else
begin
val156 := 0;
end;
if resultat143 < resultat138 then
begin
val160 := 1;
end
else
begin
val160 := 0;
end;
res162 := (resultat138 + resultat132);
if resultat147 > round(res162) then
begin
val165 := 1;
end
else
begin
val165 := 0;
end;
resultat167 := val151 + val156 + val160 + val165;
if resultat167 = 0 then
begin
val125 := 1;
if val125 = 1 then
begin
{$A+}
InterLockedExchange(ArrayItem[name_x62,i108,i121,4], val125);
{$A+}
InterLockedExchange(ArrayItem[name_x62,i108,i121,5], resultat135);
{$A+}
InterLockedExchange(ArrayItem[name_x62,i108,i121,6], round(resultat138));
{$A+}
InterLockedExchange(ArrayItem[name_x62,i108,i121,7], resultat130);
{$A+}
InterLockedExchange(ArrayItem[name_x62,i108,i121,8], round(resultat132));
end
else
begin
{$A+}
InterLockedExchange(ArrayItem[name_x62,i108,i121,4], val125);
end;
ArrayTrack[name_x62,round(val110),8] := double2str(val103);
resultat176 := (resultat130 and 65535) or (resultat132 shl 16);
_hi_onEvent(THIFTCG_Tools(FParent).Events[2], resultat176);
resultat179 := (resultat135 and 65535) or (resultat138 shl 16);
_hi_onEvent(THIFTCG_Tools(FParent).Events[1], resultat179);
end;
end;
end;
end;
procedure TClassFTCG_Tools_8EA9290.event_doSort(var Data:TData; index:word);
var
i186:integer;
i192:integer;
i196:integer;
begin
result2184:= Length(ArrayTrack[0]) - 1;
val183 := result2184;
result1185 := val183+1;
SetLength(arr114,result1185,2);
result1185:= Length(arr114) - 1;
for i186 := 1 to result1185 do
begin
result8x189:= ArrayTrack[name_x62,i186,7];
val188 := str2double(result8x189);
arr114[i186,0] := i186;
arr114[i186,1] := val188;
end;
for i192 := 1 to 1410065400 do
begin
val195 := 0;
result1185:= Length(arr114) - 1;
for i196 := 1 to result1185 do
begin
result2x198:= arr114[i196,1];
val197 := result2x198;
res200 := (i196 + 1);
result1185:= Length(arr114) - 1;
if res200 <= result1185 then
begin
val202 := round(res200);
result2x204:= arr114[val202,1];
val203 := result2x204;
end;
if val197 > val203 then
begin
val195 := 1;
result1x209:= arr114[i196,0];
val208 := result1x209;
result2x209:= arr114[i196,1];
val210 := result2x209;
result1x212:= arr114[val202,0];
val211 := result1x212;
result2x212:= arr114[val202,1];
val213 := result2x212;
arr114[val202,0] := val208;
arr114[val202,1] := val210;
arr114[i196,0] := val211;
arr114[i196,1] := val213;
end;
end;
if val195 = 1 then
begin
end
else
begin
break;
end;
end;
end;
procedure TClassFTCG_Tools_8EA9290.data_ColorSetki(var Data:TData; index:word);
begin
Data := _DoData(val92);
end;
end.
В частности место:
#pas
//Init критической секции
InitializeCriticalSection(CriticalSection8);
//Старт критической секции
EnterCriticalSection(CriticalSection8);
result144 := 1+1;
result244 := 64+1;
result344 := 100+1;
SetLength(ArrayItem,result144,result244,result344,9);
//Конец критической секции
LeaveCriticalSection(CriticalSection8);
пардон!!!
Понял причину! Всё правильно, просто это пример в котором всего один раз критическая секция была.
ну почему после того как задашь вопрос на форуме, только потом доходит в чем дело



Поиск
Друзья
Администрация