Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с потоками

247
08 апреля 2007 года
wanja
1.2K / / 03.02.2003
Код:
program lab2_6;
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.

Вылетает почему-то. На старом компе - под Линолеумом - не вылетала, а сейчас - под ХРюшкой - вылетает.
5
08 апреля 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: wanja
 
Код:
h[1]:=CreateThread(nil,0,@proc1,nil,0,d1);//Создаём первый поток
    h[2]:=CreateThread(nil,0,@proc2,nil,0,d2);//Создаём второй поток


В делфи НЕЛЬЗЯ вызывать CreateThread напрямую, ибо это влечёт за собой сбои в работе с кучей. Для создания потоков нужно создавать наследника класса TThread или использовать BeginThread функцию (по параметрам аналогична CreateThread).

257
08 апреля 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=hardcase]В делфи НЕЛЬЗЯ вызывать CreateThread напрямую, ибо это влечёт за собой сбои в работе с кучей. Для создания потоков нужно создавать наследника класса TThread или использовать BeginThread функцию (по параметрам аналогична CreateThread).[/quote]
ну не знаю: я всегда только CreateThread пользовался и вроде ничего - проблем не было.
2 wanja
попробуй заменить
 
Код:
WaitForMultipleObjects(2,@h,true,WT);

на
 
Код:
WaitForMultipleObjects(2,@h,true,Infinite);

после такой замены у меня нормально работает.
5
09 апреля 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: kosfiz
ну не знаю: я всегда только CreateThread пользовался и вроде ничего - проблем не было.


Вот часть описания 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]

Эта функция полезна ещё и тем, что порождаемый ею поток сам ловит все дельфийские исключения.

257
09 апреля 2007 года
kosfiz
1.6K / / 18.09.2005
собственно на вкус и цвет товарищей нет, пока что CreateThread меня устраивала и проблем с ней не было, как появятся может и призадумаюсь, а стоит ли её использовать.
247
10 апреля 2007 года
wanja
1.2K / / 03.02.2003
Поставил INFINITE - все заработало.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог