C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
"Отношения" потоков-родственников, дети-родители, проблема отцов и детей...
Smolnyj
Отправлено: 29.01.2006, 22:45


Не зарегистрирован







В общем, проблема такая:
Из основного потока создаю три дополнительных. Эти самые дополнительные потоки вполне так нормально между собой общаются посредством пишичитания глобальных переменных и использования всяких там SetEvent, WaitForSingleObject и прочих критикалсекшнов. И всё это ваще намана так работает.

НО!
блин, теперь мне нужно в основном потоке подождать окончания работы одного из этих трёх свежесозданных.
И вот как раз это-то и не проходит. Причём не проходит самым смешным образом. Т.е. при вызове из основного потока Sleep либо WaitForSingleObject — замораживаются ВСЕ потоки, и основной, и все три дополнительных. Даже в некрасивом варианте простого цикла типа if ( flag_a != 1)goto обратно — с момента входа в этот if ни один из прочих потоков управления не получает!!!! соответственно, flag_a никогда не становится =1.

Причём что интересно — в любом из "созданных руками" потоках все эти методы работают именно так, как от них и ожидаешь. А в основном потоке — ни фига.

Ладно, я допускаю, что остановка родительского потока может вызывать остановку дочерних(хотя в доках этого почему-то не нашёл). Хрен с ним.
НО ПОЧЕМУ ТОГДА НЕ РАБОТАЕТ ВАРИАНТ С ПРОСТЫМ IF???

Люди, скажите мне, я д-к или где? точнее — где именно я д-к? ;(

ОС — Win98(первая);
среда — BCB6
для создания/управления потоков использовал только функции WinAPI — перечислю все, к-е юзал: CreateThread, CreateEvent, SetEvent, ResetEvent, InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection .

Приоритеты и прочую подобную хрень не трогаю, т.е. всё по дефолту. Процессы создаю активными, в смысле — незамороженными.
Собственно, вот так:
Proc_hdrSrcSingleFile = CreateThread(NULL,NULL,SrcSingleFileProcess,NULL,NULL,&Proc_idSrcSingleFile);


Вроде, всё... Памагитя, люди добрые, совсем мозгу сломал... "Чую бесовщину, а обосновать не могу"©


P/s: использовать нити (fibers) не предлагайте — не прокатит в силу специфики так сказать задачи. В смысле, специфика задачи допускает например такую фигню, как "зависание" одного из дочерних процессов на несколько минут, ну типа того
CODE

WaitDRQ:
  in al, dx  
  cmp al,0x58  
  jnz WaitDRQ

причём оно бывает в разных местах — и это типа нормальное явление, остальные в это время даже работают... Посему нити не прокатят.
Konstantine
Отправлено: 30.01.2006, 10:39


Мастер участка

Группа: Модератор
Сообщений: 545



почти нифига не понял...
подскажу лишь одно: дождаться окончания работы потока — Thread1->WaitFor()
olegenty
Отправлено: 30.01.2006, 10:44


Ветеран

Группа: Модератор
Сообщений: 2412



тоже почти нифига не понял, но предполагаю, что главный поток использует какой-то ресурс, блокируя его навсегда (deadlock получается).

Вернуться в Вопросы программирования в C++Builder