powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Функция перегрузки ПК стала работать с переменным успехом
14 сообщений из 14, страница 1 из 1
Функция перегрузки ПК стала работать с переменным успехом
    #39664617
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток форумчане,
На протяжении полугода пользовался функцией для перегрузки ПК, проблем не возникало.
Но вот уже около недели, программа с этой функцией выдает фиртеля. Т.е. есть случаи, когда программе удается перегрузить ПК, а бывают случаи, когда с системы выгражаются программы, а перезагрузки ПК нет.
До этого не доставлял никаких программ.

Функция:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
function TFMain.MyExitWindows(RebootParam: Longword): Boolean;
var  
  TTokenHd: THandle;  
  TTokenPvg: TTokenPrivileges;  
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;  
  tpResult: Boolean;  
const  
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';  
begin  
  if Win32Platform = VER_PLATFORM_WIN32_NT then  
  begin  
    tpResult := OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,  
      TTokenHd);  
    if tpResult then  
    begin  
      tpResult := LookupPrivilegeValue(nil,  
                                       SE_SHUTDOWN_NAME,  
                                       TTokenPvg.Privileges[0].Luid);  
      TTokenPvg.PrivilegeCount := 1;  
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
      cbtpPrevious := SizeOf(rTTokenPvg);  
      pcbtpPreviousRequired := 0;  
      if tpResult then  
        Windows.AdjustTokenPrivileges(TTokenHd,  
                                      False,
                                      TTokenPvg,  
                                      cbtpPrevious, 
                                      rTTokenPvg, 
                                      pcbtpPreviousRequired); 
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;



Ее вызов:
Код: pascal
1.
MyExitWindows(EWX_REBOOT or EWX_FORCE);



В чем может быть закавыка?

Заранее спасибо за ответ

P.S.
- ОС: Windows10
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664635
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey-2008В чем может быть закавыка?

В том, что tpResult проверяется только на успех, а ошибки тупо игнорируются?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664636
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

а может быть проще поступить
Код: pascal
1.
WinExec('shutdown /r /f /t 0', SW_HIDE);



и все? Мне в этом случае "всякие нежности" не нужны.
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664639
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дело в том, что процесс, который я не контроллирую, греет очень видиокарту, и его на долго прерывать нельзя.
А температуру видео, я могу контроллировать. и при допустим свыше 74 градусов, я ничего больше не придумал, как перезагружать ПК.
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664641
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovSergey-2008В чем может быть закавыка?

В том, что tpResult проверяется только на успех, а ошибки тупо игнорируются?..


Да это я как-то пропустил. Спасибо. Буду смотреть...
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664642
А перезагрузка это не "на долго"? И разве он при этом как раз не прервётся? :3
Ну так контролируйте тот процесс, кто вам запрещает?
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664656
Лернсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно отправить компьютер в гибернацию

Код: pascal
1.
rundll32.exe Powrprof.dll,SetSuspendState 1



И в планировщик задач добавить проснутся через время
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664686
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey-2008дело в том, что процесс, который я не контроллирую, греет очень видиокарту, и его на долго прерывать нельзя.
А температуру видео, я могу контроллировать. и при допустим свыше 74 градусов, я ничего больше не придумал, как перезагружать ПК.
А не проще прибить процесс и после "остывания" видеокарты запустить заново?
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664695
А не проще SuspendThread() / ResumeThread() ?
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664701
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МолотоглавА не проще SuspendThread() / ResumeThread() ?Не проще https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686345(v=vs.85).aspx This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization. Calling SuspendThread on a thread that owns a synchronization object, such as a mutex or critical section, can lead to a deadlock if the calling thread tries to obtain a synchronization object owned by a suspended thread. To avoid this situation, a thread within an application that is not a debugger should signal the other thread to suspend itself. The target thread must be designed to watch for this signal and respond appropriately.
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39664751
Переводчик GoogleЭта функция в основном предназначена для использования отладчиками. Он не предназначен для синхронизации потоков. Вызов SuspendThread в потоке, который владеет объектом синхронизации, например мьютексом или критическим сектором, может привести к тупиковой ситуации, если вызывающий поток пытается получить объект синхронизации, принадлежащий приостановленному потоку. Чтобы избежать этой ситуации, поток в приложении, который не является отладчиком, должен сигнализировать о том, что другой поток приостанавливается. Целевая нить должна быть спроектирована так, чтобы следить за этим сигналом и реагировать соответствующим образом.
"не предназначен для синхронизации потоков" - мы и не синхронизируем.
"вызывающий поток пытается получить объект синхронизации, принадлежащий приостановленному потоку" - останавливаемый поток - чужой , мы при всём желании не сможем обладать его объекты .
Это предупреждение для потоков одного процесса.
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39665079
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey-2008,

SetPriorityClass() для процесса не решит проблему?
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39665364
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молотоглавостанавливаемый поток - чужой ,И вместе с ним мы легко можем остановить все-тот-же чужой процесс. Или несколько чужих процессов, если используется межпроцессная синхронизация, о которой мы не подозреваем
...
Рейтинг: 0 / 0
Функция перегрузки ПК стала работать с переменным успехом
    #39665596
_Vasilisk_, ну вообще-то именно это и требуется ТС...
Приостановить чужой процесс. А если есть связанные/синхронизируемые с ним - их тоже приостановить.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Функция перегрузки ПК стала работать с переменным успехом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]