![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#1
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Требуется создать несколько процессов и сгруппировать их в «задание».
И в процессе выполнения у меня возникли некоторые вопросы...
И вопрос в том, как получить дескриптор процесса, добавляемого в задание? И ещё мне не понятно, как устанавливать ограничения для всех процессов в "задании" на класс приоритета? (Знаю только константы приоритетов..как использовать, не пойму).. Сообщение отредактировано: 18192123 - 6.10.2008 20:06 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Ну, у меня вот так отработало:
#define JOB_ID "MyFirstJob\0"(то же самое можно сделать и с несколькими процессами)... Вроде Job создается, в аттаче - картинка, как это видно через ProcessExplorer от SysInternals... Сообщение отредактировано: volvo - 6.10.2008 20:53 Эскизы прикрепленных изображений ![]() |
18192123 |
![]()
Сообщение
#3
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
#define JOB_ID "MyFirstJob\0" Объясните пожалуйста, а для чего этот фрагмент нужен? Сообщение отредактировано: 18192123 - 6.10.2008 20:52 |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
А что ты хочешь делать с запущенными тобой процессами? Ну, запустила ты процесс. Добавила в JobObject, что дальше? Сразу удалить? Или сделать задержку, чтобы посмотреть, что оно запустилось, и потом удалить? С помощью WaitForSingleObject я жду завершения запущенного процесса, и потом удаляю пакет...
Ну, а в switch-е просто диагностика, по какой причине процесс завершился... |
18192123 |
![]()
Сообщение
#5
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Попробовала переписать создание процесса и добавление его в "задание" на Visual C++...
Приложение запустилось, после нажатия на кнопку, в обработчике которой происходит создание процесса, приложение вылетело...(сообщение о произошедшем на прикреплённом рисунке) Объясните пожалуйста, в чём я ошиблась?
Сообщение отредактировано: 18192123 - 19.10.2008 17:58 Эскизы прикрепленных изображений ![]() |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Старая проблема... Вкратце: второй параметр функции CreateProcess должен быть типа LPCSTR, то есть, должен быть доступен как для чтения, так и для записи... Предыдущие версии (VC6 и ниже), да и Билдер (до 2007 включительно, в Билдере 2009 тоже начнутся проблемы) работают с CreateProcessA, которая хоть и получает константную строку, но в процессе работы конвертирует ее во внутренний юникодный буфер с помощью MultiByteToWideChar, и потом вызывает CreateProcessW, которая и создает процесс...
Когда же ты работаешь в VC2005+ (или Builder 2009), под вызовом CreateProcess подразумевается прямой вызов CreateProcessW, без промежуточных преобразований... Но ведь TEXT("notepad.exe") - это константа только для чтения, поэтому и возникает ошибка... Исправлять - так: ... |
18192123 |
![]()
Сообщение
#7
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
18192123 |
![]()
Сообщение
#8
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
У меня такой вопрос: если я хочу создать несколько процессов (VC++ 2008 EE), мне нужно задействовать по нескольку структурных переменных типов STARTUPINFO и PROCESS_INFORMATION или это лишнее (с учётом того, что с созданными процессами нам потом работать - объединять в задание)?
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Дублирование STARTUPINFO в любом случае лишнее... Попробовал в код из сообщения №2 добавить еще один процесс, не добавляя для него STARTUPINFO - процессы нормально добавляются (обрати внимание, в функции CreateProcess предпоследний параметр - IN, то есть, не возвращает ничего нового из функции, а вот последний - OUT, значит возвращает полезную информацию)...
|
18192123 |
![]()
Сообщение
#10
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Вот что у меня получилось..
Вылетает с ошибкой Run-Time Check Failure #2 - Stack around the variable 'h' was corrupted.
Объясните пожалуйста, что я не правильно делаю? Сообщение отредактировано: 18192123 - 21.10.2008 20:58 |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата что я не правильно делаю? Портишь стэк:HANDLE h[4];должно работать... |
18192123 |
![]()
Сообщение
#12
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
18192123 |
![]()
Сообщение
#13
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Хочу установить ограничения для всех процессов в созданном ранее задании на класс приоритета...Скажите пожалуйста, а какие это классы? И устанавливать нужно, используя функцию SetInformationJobObject() или нет?
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Цитата устанавливать нужно, используя функцию SetInformationJobObject() Да, ограничения на Job устанавливаются через SetInformationJobObject()Цитата Хочу установить ограничения для всех процессов в созданном ранее задании на класс приоритета... Ну, так в чем проблема? ![]() // создаем объект ядра "задание"(фрагмент программы - из книги Дж. Рихтера "Создание эффективных Win32 приложений", глава 5) |
18192123 |
![]()
Сообщение
#15
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Спасибо большое!)
Проблема в том, что ни в одно условие не заходит..соответственно jobli.PriorityClass в конце концов остаётся 0.. Хотя при трассировке получаю такое..(прикреплённый рисунок) Скажите пожалуйста, В чём может быть причина? Эскизы прикрепленных изображений ![]() |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Цитата В чём может быть причина? Ай-яй-яй... Нельзя строки сравнивать через "=="... Надо пользоваться функциями сравнения... Ну, скажем:if(!wcscmp(lpProcName, L"IDLE")) {В Билдере по-крайней мере работает... |
18192123 |
![]()
Сообщение
#17
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
18192123 |
![]()
Сообщение
#18
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Теперь пытаюсь вывести информацию о имеющемся задании...
Вот такая ошибка: 1>c:\study\3 kyrs\os\lab3\lab3\main.cpp(301) : error C2440: 'initializing' : cannot convert from 'void *' to 'PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION' Объясните пожалуйста, как устранить эту ошибку?
|
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
Цитата как устранить эту ошибку? Как и всегда при выделении памяти - явным приведением типов (практически все функции, выделяющие память, возвращают универсальный void*, а ты на выходе его ловишь, и превращаешь в то, что нужно):PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION pjbai =(Обрати внимание на предупреждение, что _alloca() не рекомендавана к использованию; есть более безопасная версия: _malloca()...) |
18192123 |
![]()
Сообщение
#20
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Ранее я устанавливала приоритет..:
Когда выводила информацию о задании, наткнулась на то, что класс приоритета всегда остаётся NORMAL(32)... И вот теперь не пойму...где ошиблась..или в чём причина? Объясните пожалуйста.
|
![]() ![]() |
![]() |
Текстовая версия | 23.07.2025 21:07 |