Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2011, 16:55   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию OpenThread неправильно указан параметр

Всем доброго. Есть задача ставить на паузу-пуск один процесс, который грузит процессор на 100%. Предполагаю что постановка его на паузу снимет загрузку, и позволит работать другим программам.
Для этого пытаюсь использовать следующие действия:
1) Создаю процесс:
Код:
 CreateProcess('C:\WINDOWS\system32\cmd.exe','/c '+pth+'foxprox main.app', nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi)
Не обращайте внимание на отсутствие проверки правильной отработки функции, я ее еще не прикрутил.

2) Пытаюсь открыть процесс с доступом на остановку:
Код:
var t:THandle;
begin
 SetLastError(0);
 t:=OpenThread(2,false,pi.dwThreadId);
 if t=0 then RaiseLastWin32Error else
  SuspendThread(t);
end;
В результате получаю ошибку: Неверный параметр на функции OpenThread.

Подскажите что именно я неверно передаю.

функция у меня описана так:\
Код:
  function OpenThread(dwDesiredAccess:DWORD;bInheritHandle:BOOLEAN;dwThreadId:DWORD):THandle; external 'Kernel32.dll';
Согласно
Цитата:
HANDLE WINAPI OpenThread(
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in DWORD dwThreadId
);
Заранее спасибо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.06.2011, 17:01   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1) почему бы не стартануть его на паузе? флаг CREATE_SUSPENDED.
2)в pi есть hThread, уже открытый хендл главного потока

да и кстати, если процесс создает еще потоки, то ты не их поставишь на паузу, а лишь главный(первый)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 21.06.2011 в 17:04.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2011, 18:07   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему бы не стартануть его на паузе?
А потом? Нужно чтоб пользователь, поработав, поставил на паузу, а после по надобности разморозил и продолжал работать. При старте у него спрашивается логин - он должен его ввести, так что старт с паузой не подойдет.
Цитата:
в pi есть hThread, уже открытый хендл главного потока
С ним тоже что-то не то. Я еще попробую раз но на нем вылезала ошибка при первой пробе.

Цитата:
если процесс создает еще потоки, то ты не их поставишь на паузу, а лишь главный(первый)
За это я не беспокоюсь - это ДОС программа, врядли она потоками орудует

Меня больше интересует почему такая ошибка выдается странная...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.06.2011, 18:25   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

так, Виталий, чтото не учел я одного, ты ведь запускаешь cmd, а потом уже он запускает нужный процесс, так?
если так то оно и понятно, cmd то закрывается как запустит приложение.
может тебе стоит искать нужный процесс по имени, брать pid потом открывать его и орудовать с ним?(еще можно в сторону Jobs глянуть, но в Делфи помоему их не было, всмысле заголовочников, разве что в Jedi смотреть)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2011, 21:14   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты меня подтолкнул таки к правильному ответу.
Код:
if not CreateProcess(nil,'D:\Ukrpost\GetPlat\foxprox.exe main.app', nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS , nil, 'D:\Ukrpost\GetPlat\', si, pi)
then RaiseLastWin32Error;
На сей раз NTVDM без каких либо добавок (впрочем позже я попробую это с cmd).
И правильным решением было:
Код:
SuspendThread(pi.hThread);
А не dwThreadId как описано в хелпе.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Че неправильно! HixoH Общие вопросы C/C++ 0 23.12.2009 15:04
Народ как загрузить текст в Memo из готового фала, который указан в ListBox?) OPF_Nik Общие вопросы Delphi 7 09.11.2009 23:13
что неправильно? helavisa Общие вопросы C/C++ 18 02.06.2009 17:51
Автоматический запуск макросов с листа на котором указан перечень макросов с параметрами и без Neoli Microsoft Office Excel 2 09.03.2009 14:31
запрос который бы подсчитывал количество полных лет начиная с того года который указан в данных мне базах PereCCC Помощь студентам 8 15.05.2008 16:24