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