Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WaitForMultipleObjects из консольного приложения 
:(
    Опции темы
youngprankster
Дата 19.3.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



Не понимаю особенностей работы.
Пытаюсь запустить консольное приложение несколько раз с некоторыми параметрами. CreateProcess отрабатывает нормально, но WaitForMultipleObjects выдает WAIT_FAILED - код ошибки 6 (Invalide handle).
Интересность в том, что если вышеозначенные действия я делаю для приложения с формами (VCL Forms Application) - все работает "на ура". Когда же я абсолютно тот же код запускаю из консоли (Console Application) - собственно, и происходит описанный ошибочный эффект.
Созданные консольные приложения на момент вызова WaitForMultipleObjects работают.

Буду признателен за помощь!  smile 

Код

//    <...>
//    число консолей
int processesCount = 0;
HANDLE *hApplications = new HANDLE[0];
//    поиск нужных файлов
TSearchRec fDirContents;
String path = "C:\\дындындын\\";
if (FindFirst(path + "*.*", faAnyFile, fDirContents) == 0)
{
    do
        if ((fDirContents.Name != ".") && (fDirContents.Name != "..") &&
                !(fDirContents.Attr & faVolumeID) && (fDirContents.Attr & faDirectory))
        {
            //    новое число процессов
            processesCount ++;
            SetHandlesArraySize(hApplications, processesCount);
            //    <...>
            //    создание процесса
            STARTUPINFO sInfo;
            PROCESS_INFORMATION pInfo;
            memset(&pInfo, 0, sizeof(pInfo));
            memset(&sInfo, 0, sizeof(sInfo));
            sInfo.cb = sizeof(sInfo);
            if (CreateProcess(0, "\"C:\\t 1\\1.exe\" \"param1\" \"param2\" \"param3\"",
                                                0, 0, true, CREATE_NEW_CONSOLE, 0, 0, &sInfo, &pInfo))
                hApplications[processesCount - 1] = pInfo.hProcess;
            else
                processesCount = NONE;
        }
    while ((FindNext(fDirContents) == 0) && (processesCount != NONE));
    FindClose(fDirContents);
}
//    проверка и ожидание
if (processesCount > 0)
{
    //    <...>
    //    дождаться завершения процессов
    DWORD waitResult = WaitForMultipleObjects(processesCount, hApplications, TRUE, INFINITE);
    switch (waitResult)
    {
        case WAIT_FAILED:
            //    <...>
        break;
        default:
            //    <...>
    }
}
//    <...>

void SetHandlesArraySize(HANDLE *array, int size)
//    установить размеры массива дескрипторов процессов
{
    HANDLE *newArray = new HANDLE[size];
    for (size_t i = 0; i < sizeof(array) / sizeof(array[0]); i ++)
        newArray[i] = array[i];
    delete array;
    array = newArray;
}


Это сообщение отредактировал(а) youngprankster - 19.3.2010, 16:02
PM MAIL   Вверх
world
Дата 19.3.2010, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: нет
Всего: 12



1.Единственная мысль, что программа не может получить дескриптор одного или нескольких потоков.
В связи с этим предлагаю модифицировать программу в районе 26 строчки. Добавив проверку на создание не инвалидного дескриптора.

Код

if(pInfo.hProcess != INVALID_HANDLE_VALUE)
{
    hApplications[processesCount - 1] = pInfo.hProcess;
}


2.Когда я учил эту часть языка. Преподаватель советовал вместо

Код

CreateProcess(0, "\"C:\\t 1\\1.exe\" \"param1\" \"param2\" \"param3\"" ...


использовать

Код

char* x = "\"C:\\t 1\\1.exe\" \"param1\" \"param2\" \"param3\"";
CreateProcess(0, x, 0, 0, true, CREATE_NEW_CONSOLE, 0, 0, &sInfo, &pInfo);


Мотивировав это, тем, что на некоторых версиях ОС будет возникать ошибка, связанная с тем, что функция CreateProcess, хотя и не изменяет командую строку, но в свою очередь требует не константной строки, правда, признаюсь честно, это точно не решит Вашей проблемы
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
youngprankster
Дата 20.3.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



Цитата

1.Единственная мысль, что программа не может получить дескриптор одного или нескольких потоков.
В связи с этим предлагаю модифицировать программу в районе 26 строчки. Добавив проверку на создание не инвалидного дескриптора.

На валидность дескрипторов проверял. При преобразовании к числу выходит вполне правдоподобный идентификатор, который, правда, не совпадает ни с одним из тех, что можно видеть в диспетчере задач. Если же брать pInfo.dwProcessId, то он в точности совпадает с тем процессом, который порожден программой и крутится в списке задач. Попытка заменить 
Код
hApplications[processesCount - 1] = pInfo.hProcess;
 на 
Код
hApplications[processesCount - 1] = (HANDLE)pInfo.dwProcessId;
 успеха не принесла  smile 

Цитата

2.Когда я учил эту часть языка. Преподаватель советовал...
Мотивировав это, тем, что на некоторых версиях ОС будет возникать ошибка, связанная с тем, что функция CreateProcess, хотя и не изменяет командую строку, но в свою очередь требует не константной строки, правда, признаюсь честно, это точно не решит Вашей проблемы

Хм, интересно  smile  Вообще говоря, у меня в виде Строка.t_str() передается. Просто для наглядности на форуме выбрал такую форму записи - чтобы сразу понятно было, что и как запускается, пусть и на абстрактном примере. Но, хотя в данном случае это и не поможет, спасибо за информацию - приму к сведению  smile 

Мне кажется, что копать надо именно в сторону того, что ожидание происходит консольного приложения из консоли - ибо из "форменного" все работает. Вот только куда копать... мозг уже плавится  smile 
PM MAIL   Вверх
world
Дата 20.3.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: нет
Всего: 12



Пытался промоделировать возникновение ошибки, не разу не удалось получить необходимый результат (в смысле ошибку)  smile  smile  smile .  
Уже пробовал запускать и консольные и оконные приложения, и менял параметры функций, ошибка не возникает  smile  smile  smile .

Разве, что возникла идея, как можно проверить, это проблема с дескрипторами или функцией. Попробуй задать все значения в CreateProcess по умолчанию

Код

CreateProcess(0, x, 0, 0, FALSE, 0, 0, 0, &sInfo, &pInfo); // где х - командная строка


если ошибка, будет возникать, надо проверять правильность дескрипторов, нет - где-то в сторону параметров функции рыть надо.


Цитата

При преобразовании к числу выходит вполне правдоподобный идентификатор, который, правда, не совпадает ни с одним из тех, что можно видеть в диспетчере задач.



Дк, дескриптор вроде и не должен может и не совпадать с идентификатором. Вобщемто поэтому попытка приведения идентификатора к дескриптору и не увенчалась успехом.

ЗЫ. А как срочно проблема должна быть решена. Могу в понедельник подойти к преподу, который на этом специализируется проконсультироваться. (правда отвечу не раньше 16.00 по GMT+2).

Это сообщение отредактировал(а) world - 20.3.2010, 19:17
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
youngprankster
Дата 20.3.2010, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



Цитата

Дк, дескриптор вроде и не должен может и не совпадать с идентификатором

Это был шаг отчаяния. Расчет на "вдруг покатит"  smile 

Косяк был в кривом использовании мною массива - перешел на vector  и все заработало  smile
Спасибо, за участие в решении проблемы, world  smile 
PM MAIL   Вверх
world
Дата 21.3.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: нет
Всего: 12



Всегда, пожалуйста. smile 
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.