- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
const n=10;
type
xfl = record x: double; fl: longint; end;
ar_xfl = array[1..2*n] of xfl;
var
i: longint;
x,y,r: double;
a: ar_xfl;
f: text;
procedure qsort(var a: ar_xfl; lo,hi: longint);
procedure sort(l,r: longint);
var
i,j,k: longint;
tmp: xfl;
begin
i:=l;
j:=r;
k:=(l+r) div 2;
repeat
while a[i].x<a[k].x do inc(i);
while a[k].x<a[j].x do dec(j);
if i<=j then
begin
tmp:=a[i];
a[i]:=a[j];
a[j]:=tmp;
inc(i);
dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
sort(lo,hi);
end;
За такие названия переменных надо руки завязывать узлом. Да и помимо этого..
kipar 05.12.2014 12:22 # 0
А помимо этого что?
bormand 05.12.2014 14:51 # 0
kipar 05.12.2014 14:59 # 0
guest 05.12.2014 15:54 # 0
Есть многопоточная прога. При создании потоков, инкрементируется значение переменной-счётчика, при деструкции - декрементируется. При закрытии формы, прога тормозит все потоки и ждёт, когда они завершатся, чтобы не было утечки, проверяя значение переменной - равно ли оно нулю. Если равно нулю - программа завершается. В каком месте в классе потока нужно уменьшать счётчик? Я запутался.
Также я пытался отказаться от счётчика и перед завершением программы в цикле проверять, сколько потоков осталось в листе - менеджер памяти молчит, значит, утечек нет. Но правильно ли так делать? Есть ли гарантии, что доп-потоки успеют разрушиться, до завершения главного потока?
defecate-plusplus 05.12.2014 16:00 # 0
дельфинопотокобезопасно ли это?
guest 05.12.2014 16:02 # 0
defecate-plusplus 05.12.2014 16:09 # 0
It is perfectly safe to execute code after a call to an inherited destructor, so long as that code does not rely on something that has been destroyed by that inherited destructor. In the same way it is safe to execute code before a call to an inherited constructor, so long as the code does not rely on anything instantiated in that inherited constructor.
если твоё ThreadsCount не поле твоего объекта, то работать с ним можно
btw почитай про семафоры, наверняка они должны быть в дельфях, как и wait оного, а то
> проверяя значение переменной - равно ли оно нулю
спинлок вручную?
bormand 05.12.2014 16:34 # 0
Семафорка не особо поможет, тут надо wait condition. Хотя, имхо, и текущая версия с busy wait сойдет - один фиг это уже завершение работы (и, скорее всего, у него в этом цикле стоит небольшой sleep, отдающий такты остальным тредам).
defecate-plusplus 05.12.2014 17:03 # 0
кроме того, что с кондишеном придется 3 сущности заводить (мютекс, кондишен, счетчик), а семафор сам по себе три в одном
bormand 05.12.2014 18:23 # 0
guest 05.12.2014 18:46 # 0
guest 05.12.2014 18:52 # 0
http://pastebin.com/E8CHyr9M
Там описан класс tthread
guest 05.12.2014 16:49 # 0
Там банальный вызов waitforsingleobject. Но было непонятно всё же, куда пихать декремент счётчика, ибо освобождение ресурсов происходит не при завершении потока (завершение-то легко определить), а при его деструкции.
Спасибо)
bormand 05.12.2014 16:27 # 0
Гарантий нету, часть тредов может не успеть позакрывать файлы, а главный уже увидит пустой список и завершит прогу.
В текущей версии серьезных проблем не вижу.
guest 05.12.2014 16:43 # 0
kegdan 06.12.2014 10:47 # 0
kegdan 06.12.2014 10:50 # 0
guest 05.12.2014 17:26 # +2
kegdan 06.12.2014 10:49 # +3
Анонимус 06.12.2014 00:28 # +1
У вас в продакшене сами написали свой квиксорт? А merge sort есть свой? А связанный список? А строка своя?
kipar 06.12.2014 01:25 # +1