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 получается).
|
|
|