|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.10.2012, 12:36 | #1 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
Многократная приостановка и возобновление выполнения процеса
Здраствуйте. У меня задача по лабе создать некое подобие деспетчера управления процесами. Там создается очередь выполнения и каждому процесу нужно давать по небольшому промежутку времени на выполнение, а потом если процес не выполнился полностью, приостановить его, поместить в конец очереди(в противном случае его нужно удалить из очереди). потом опять когда дойдет очередь до этого же процеса, его выполнение нужно возобновить. и так до тех пор пока он не выполнется.
Собсно вопрос: как сделать само прерывание выполнения процеса и последущее возобновление? я пробовал так: Код:
все что мне нужно это правильно приостановить процес, а потом возобновить с того же места, ненадо никаких очередей делать. это все у меня уже есть. все работатет если выполнять WaitForSingleObject(pi.hProcess, INFINITE); но так не годится! а вдруг выполнение процеса затянется на 30 минут!? нет. надо прервать и дать другим пощупать процесор пальчиками подскажите, пожалуйста, как будет правильние реализировать подобную задачу на winapi? заранее спасибо |
08.10.2012, 12:42 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
процесс не исполняет код, исполняет код поток.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
08.10.2012, 13:05 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
То, что вы написали будет работать только с процессами, которые не создают дополнительных потоков. Вам нужно просматривать список всех потоков процесса и останавливать их, причем делать это несколько раз, на предмет появления новых потоков, причем старые уже замороженные не надо трогать. И все равно, если поток сделал несколько раз ResumeThread то вы его не остановите. Иными словами 100% решения вашей проблемы нет
Лучше посмотрите в сторону SetPriorityClass(). Уж не знаю, что делают ваши процессы, но раз их надо останавливать лучше переделать процессы так, чтоб не надо было их останавливать. |
08.10.2012, 13:33 | #4 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
эм.. процесы точно однопотоквые. ибо этот диспетчер управления, принимает на вход только 3 программы, но многократно. то есть сначала вся очередь состоит из первой программо, когда данная программа выполнилась, она удаляется из очереди и в очередь добавляется вторая програма на выполнение и тд. это программы которые я тоже должен написать сам(точнее уже написал) - простые программы, в которых есть немножко кода записаного в int main(). вот так то.
или даже в этом слчае фраза остается в силе? Последний раз редактировалось lowercase; 08.10.2012 в 13:37. |
08.10.2012, 13:40 | #5 | |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Цитата:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
|
08.10.2012, 13:49 | #6 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
извените за столь большую кучу текста и минимума сути.
вот так у меня выглядит main(); Код:
Код:
Последний раз редактировалось lowercase; 08.10.2012 в 13:57. |
08.10.2012, 13:59 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Отпечатайте что содержит pi.hThread перед каждым вызовом SuspendThread/ResumeThread а также проверяйте вызовы на предмет ошибок.
Кроме того, не совсем понятно зачем надо создавать оконченные процессы заново? Именно поэтому ваш цикл никогда не заканчивается. Кстати, кто будет закрывать ненужные HANDLE? PS. Еслки процессы точно однопоточные, тогда в принципе проблем не должно быть, но опять таки, если процесс сам сделает себе ResumeThread лишний раз, тогда у вас уже не получится останавливать поток. |
08.10.2012, 14:06 | #8 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
нет, нет, цыкл не заканичваются потому, что програмы программы не выполняются. то есть до строчки printf("process %s was end with code %d\n", cmdline, call_result); дело не доходит.
и там не одни и теже программы создаются заново. там разные. всего три программы, которые выполняются в строго определенном проядке. вот эти строчки Код:
Последний раз редактировалось lowercase; 08.10.2012 в 14:14. |
08.10.2012, 14:12 | #9 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
попробовал выводить pi.hThread, вставил строчки для вывода перед ResumTheard(pi.hThread) и SuspendTheard(pi.hThread);
программа выводит только для первого процеса, дальше стандартное окно ошибки приложения windows, а программа ожидает завершения созданых ею процесов. |
08.10.2012, 14:17 | #10 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
эм. может тогда мне надо проверять на WAIT_TIMEOUT, а не на WAIT_OBJECT_0?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Приостановка выполнения цикла | ACE Valery | Общие вопросы C/C++ | 21 | 19.11.2011 12:40 |
многократная выгрузка запроса по парамеру в excel | omka | Microsoft Office Access | 0 | 23.05.2011 18:31 |
Многократная декларация | Greynvi4 | Общие вопросы C/C++ | 17 | 10.08.2009 16:52 |
приостановка выполнения процедуры | BESS | Общие вопросы Delphi | 5 | 15.09.2008 00:53 |
Приостановка цикла для выполнения внешней программы | Uomo | Общие вопросы Delphi | 3 | 04.04.2008 11:48 |