Проблема с потоками
uses
Windows;//,SysUtils;
const WTime=10;//Сколько ждать
var h:array[1..2]of Thandle;//Дескрипторы потоков
d1,d2:cardinal;//Идентификаторы потоков(зачем-то нужны)
cs:TRTLCriticalSection;//Критические секции
// excode:dword;
WT:DWORD;
to_chg:integer;
i,n1,n2:integer;
function proc1(d:dword):dword; stdcall;//Процедура одного потока
begin
sleep(WTime);
EnterCriticalSection(cs);//Входим в первую КС
to_chg:=1;
LeaveCriticalSection(cs);//Выходим
result:=0;
end;
function proc2(d:dword):dword; stdcall;//процедура второго
begin
EnterCriticalSection(cs);//Входим во вторую КС
to_chg:=2;
LeaveCriticalSection(cs);//Выходим
result:=0;
end;
Begin//Основная программа
AllocConsole;//Чтоб консоль появилась
InitializeCriticalSection(cs);//Созд. КС
n1:=0;
n2:=0;
for i:=1 to 10 do
begin
h[1]:=CreateThread(nil,0,@proc1,nil,0,d1);//Создаём первый поток
h[2]:=CreateThread(nil,0,@proc2,nil,0,d2);//Создаём второй поток
WaitForMultipleObjects(2,@h,true,WT);
if to_chg=2 then
inc(n1)
else
inc(n2);
CloseHandle(h[1]);//Закрываем дескриптор первого потока
CloseHandle(h[2]);//Закрываем дескриптор второго потока
end;
DeleteCriticalSection(cs);//Убиваем КС
write('score ',n1,':',n2);
readln;
FreeConsole;//Закрываем консоль
End.
Вылетает почему-то. На старом компе - под Линолеумом - не вылетала, а сейчас - под ХРюшкой - вылетает.
h[2]:=CreateThread(nil,0,@proc2,nil,0,d2);//Создаём второй поток
В делфи НЕЛЬЗЯ вызывать CreateThread напрямую, ибо это влечёт за собой сбои в работе с кучей. Для создания потоков нужно создавать наследника класса TThread или использовать BeginThread функцию (по параметрам аналогична CreateThread).
ну не знаю: я всегда только CreateThread пользовался и вроде ничего - проблем не было.
2 wanja
попробуй заменить
на
после такой замены у меня нормально работает.
Вот часть описания BeginThread, взятая из борландовской документации:
[QUOTE=Borland]
Use this routine (BeginThread) or a TThread object to spawn separate threads of execution. BeginThread spawns a new thread of execution and sets the global IsMultiThread variable, thereby making the heap thread-safe.
However, because BeginThread sets up an execution frame, the system's default exception handler will catch any exceptions that escape ThreadFunc.
[/QUOTE]
Эта функция полезна ещё и тем, что порождаемый ею поток сам ловит все дельфийские исключения.