Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4

Модерирует : ShIvADeSt

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksoid1978

Цитата:
Так смотри, в самом MPC по таймеру идет сброс и возврат настроек, т.е. выставляется Скринсейвер-выключен, и тут же возвращает обратно флаг. Это, видимо, не сбрасывает таймер бездействия, и как только перестается это делать - монитор гаснет. Вот в чем прикол.  

вот вроде тут написано как сбросить idle timer у винды http://forum.sysinternals.com/forum_posts.asp?TID=16362
а вот что говорит msdn

Цитата:
 
Calling SetThreadExecutionState without ES_CONTINUOUS simply resets the idle timer; to keep the display or system in the working state, the thread must call SetThreadExecutionState periodically.
 
To run properly on a power-managed computer, applications such as fax servers, answering machines, backup agents, and network management applications must use both ES_SYSTEM_REQUIRED and ES_CONTINUOUS when they process events. Multimedia applications, such as video players and presentation applications, must use ES_DISPLAY_REQUIRED when they display video for long periods of time without user input. Applications such as word processors, spreadsheets, browsers, and games do not need to call SetThreadExecutionState.
 


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:37 26-05-2009 | Исправлено: ShIvADeSt, 08:40 26-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Спасибо - проверю

----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 08:41 26-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Проверил - вызов SetThreadExecutionState не помогает, просто накидал прогу, при создании формы вызываю SetThreadExecutionState, пример взял с MSDN - http://msdn.microsoft.com/en-us/library/aa373208(VS.85).aspx, нифига - всеравно по таймеру включается скринсейвер а далее монитор вырубается(тоже по таймеру). Что-то непонятно.
Хотя по идее, пока программа не вызовет SetThreadExecutionState(ES_CONTINUOUS) не должно.


----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 10:51 26-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksoid1978

Цитата:
Проверил - вызов SetThreadExecutionState не помогает, просто накидал прогу, при создании формы вызываю SetThreadExecutionState,

Система у меня ВиндоусХР СП3. Выставил отключение ДИСПЛЕЯ на 1 минуту. Дисплей через минуту отключился.
Склепал программку

Код:
 
type
  EXECUTION_STATE = DWORD;
const
  ES_SYSTEM_REQUIRED = $00000001;
  ES_DISPLAY_REQUIRED = $00000002;
  ES_USER_PRESENT = $00000004;
  ES_AWAYMODE_REQUIRED = $00000040;
  ES_CONTINUOUS = $80000000;
  KernelDLL = 'kernel32.dll';
 
procedure SetThreadExecutionState(ESFlags: EXECUTION_STATE) ; stdcall; external kernel32 name 'SetThreadExecutionState';
 
procedure TForm1.Button1Click(Sender: TObject);
begin
        SetThreadExecutionState(ES_DISPLAY_REQUIRED or ES_CONTINUOUS);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
        SetThreadExecutionState(ES_CONTINUOUS);
end;
 

при нажатии на кнопку 1 - монитор не выключался сам 2 минуты. Нажал кнопку 2 - монитор погас через 1 минуту.
Вывод - ты что то с флагами намудрил
ЗЫ, насчет скринсейвера - используй кусок который ты сам нарыл. Так как данная функция не предназначена для него.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 13:56 26-05-2009 | Исправлено: ShIvADeSt, 01:59 27-05-2009
RS85



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые спецы, помогите кто сможет.
 
Пишу я кодировщик Хоффмана. И возникает такая трабла: вот функция, которая записывает в узлы дерева веса встречающихся в файле символов. Суммирует для каждого символа частоты вхождения.
Всё бы хорошо, но только она почему-то работает только для английских букв и цифр. Русские буквы и спец символы не заносит.
Ничего не могу понять. Вроде бы ord даёт коды всех 255 символов ASCII?
Но у меня почему-то веса русских букв остаются нулевыми...
 
Или я чё-то не то делаю?
 
 
Procedure Symbol;
var
a: array [0..511-1] of Object;
num2:Integer;
Strin: AnsiChar;
begin
TFS := TFileStream.Create('C:\ff.txt', fmOpenRead);
while TFS.Position <> TFS.Size do
begin
TFS.Read(Strin, 1);
num2:=ord(Strin);
a[num2].Ves:=a[num2].Ves+1;
end;
TFS.Free;
end;
 
 
 
Добавлено:
Долго не мог понять в чем дело, вываливается Acces Violation и всё.
Потом заметил, что это происходит только если в файле есть русские буквы.
 
Если файл полностью состоит из английских букв (но без спец символов), то всё жмется замечательно.
 
Вобщем кодер жмет только "чисто английский текст"

Всего записей: 588 | Зарегистр. 07-02-2007 | Отправлено: 17:57 26-05-2009 | Исправлено: RS85, 18:11 26-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
при нажатии на кнопку 1 - монитор не выключался сам 2 минуты. Нажал кнопку 2 - монитор погас через 1 секунду.

 
Вот в том то и проблема - что мне надо чтобы вов ремя работы программы, не срабатывал таймер бездействия, а как ты сам сказал, после вызова
 
SetThreadExecutionState(ES_CONTINUOUS);
 
вырубается моник сразу же, а должен только через минуту, вернее мне надо. Получается эта процедура не дает срабатывать таймеру бездействия, но не обнуляет его.

----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 01:51 27-05-2009 | Исправлено: Aleksoid1978, 01:52 27-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksoid1978

Цитата:
вырубается моник сразу же, а должен только через минуту, вернее мне надо. Получается эта процедура не дает срабатывать таймеру бездействия, но не обнуляет его.

Блин опечатался - через 1 минуту вырубается у меня Не знаю как у тебя, а у меня все отлично отрабатывает. Попробуй написать голую программу. Отключи запуск скринсейвера, настрой только угасание моника через 1 минуту. Запусти прогу. Не нажимай кнопок. По идее через 1 минуту должен погаснуть моник. Нажми кнопку 1. Моник не погаснет никогда. Нажми кнопку 2. Моник должен будет погаснуть через 1 минуту после нажатия. У меня именно так работало. У меня подозрение, что манипуляции МРС с установкой отключения заново активируют данную фичу. Поэтому надо проверять когда он не запущен. В общем отпишись.  
Блин данный вопрос надо было в отдельную тему выделить - ибо не типовой

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:02 27-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Ага - я проверил, все отлично работает, видимо первый раз в попыхах чето с флагами намутил. ОГРОМНОЕ спасибо за помощь - пошел вносить изменения в MPC-HC и тестить.
 
З.Ы. - от включения скринсейвера тоже спасает, кстати ...


----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 02:57 27-05-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85
Подсказать трудно. Хотябы не видно как сделано свойство "ves".
Для подобных ситуаций нужен точный код, а не общая идея.
Думаю, что "русские буквы" не причем. Вообще можно смело считать байты, без всяких преобразований типа ord(Strin).

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 03:52 27-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85

Цитата:
Долго не мог понять в чем дело, вываливается Acces Violation и всё.
Потом заметил, что это происходит только если в файле есть русские буквы.  

вот тестил твой код, немного его поправил - у тебя не было зануление массива в итоге там разный мусор был, прогнал на файле со смешанными русскими и англ буквами (ОЕМ и АНСИ кодировка) - не было ошибок вообще.

Код:
 
type
 _Object=record
   ves:word;
 end;
 
Procedure Symbol;
var
a: array [0..511-1] of _Object;
num2:Integer;
Strin: AnsiChar;
TFS :TFileStream;
begin
ZeroMemory(@a,sizeof(a));
TFS := TFileStream.Create('C:\ff.txt', fmOpenRead);
while TFS.Position <> TFS.Size do
begin
TFS.Read(Strin, 1);
num2:=ord(Strin);
a[num2].Ves:=a[num2].Ves+1;
end;
TFS.Free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
     Symbol;
end;
 

попробуй добавить обнуление массива, да и тип Object не есть хорошо - это стандартный класс.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:21 27-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Прикол такой - этот метод спокойно работает в ХП СП3, в 7 7127 ... но не пашет в Висте СП2. Почему такое - непонятно.

----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 07:55 27-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksoid1978

Цитата:
Прикол такой - этот метод спокойно работает в ХП СП3, в 7 7127 ... но не пашет в Висте СП2. Почему такое - непонятно.

есть подозрение - маниакальный UAC у висты.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:06 27-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Выключен и работаю под "настоящим" Админом


----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 09:52 27-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksoid1978

Цитата:
Выключен и работаю под "настоящим" Админом  

Попробуй под вистой вот такой код
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED)


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:47 27-05-2009
Aladdinych



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите плз решение проблемы
Нужно параллельно пинговать несколько хостов
я использую для этого компонент IdIcmpClient.
По количеству хостов создаю соответствующее количество потоков.
В каждом потоке создается свой IdIcmpClient для отдельного хоста.
Запускаю на выполнение - в результате почему-то показываюся дяже ответы от тех хостов, которые не должны пинговаться.
 
Что я неправильно делаю?

Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 12:24 27-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aladdinych

Цитата:
По количеству хостов создаю соответствующее количество потоков.  
В каждом потоке создается свой IdIcmpClient для отдельного хоста.  
Запускаю на выполнение - в результате почему-то показываюся дяже ответы от тех хостов, которые не должны пинговаться.

Как ты думаешь - тут есть телепаты? Либо код, либо ошибка в 15 строке второго модуля.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 12:40 27-05-2009
Aladdinych



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Из основной формы:
Данные по хостам сидят в таблице RxMemoryData1
Подробнее...
 
 
Добавлено:
Индикатор хоста - кружочек  
если хост пингуется - светится светло-зеленым, если нет красным
 
Поля таблицы
RxMemoryData1IPAddress - string - IP адрес хоста
RxMemoryData1XPos - integer - Х координата индикатора хоста
RxMemoryData1YPos - integer - Y координата индикатора хоста
остальные поля не важны

Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 14:12 27-05-2009 | Исправлено: ShIvADeSt, 15:04 27-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aladdinych

Цитата:
По количеству хостов создаю соответствующее количество потоков.

Ндас посмотрел твой код - бредовый мягко сказать. Тут надо вначале матчасть учить, а потом такие вещи писать. Первая ошибка из-за которой все грабли - у тебя создается много потоков, а переменная под них одна. Что там творится в памяти - хз. По хорошему надо массив из TProcess использовать. Тогда что то дельное будет возможно. Для начала кстати убери все TShape все пинги, просто заставь свои потоки что то делать правильно без ошибок (например каждый поток пусть считает какой нить ряд первый 1+1+1+1... второй 2+2+2+2+... третий 3+3+3+3...) - это нужно чтобы удостовериться, что потоки реально работают правильно. Как только этого добьешься - перейдем к пингам. Кстати - сделай отдельную тему или найди старую (уже была тема насчет пингов поищи только). Там и будем вести исследования. Так как тема все таки специфичная - не совсем типовая задача, что потоки, что пинги

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 15:43 27-05-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Хотел помочь RS85, но даже подуматьне мог, что он выложил код.  
Я думал он фрагментом кода идею излагает. Видно у Вас огромный опыт телепатического общения.    Искриний респект!

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 02:29 28-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, подскажите, а то сам чето догнать не могу :
 
Есть такая виндовая апишная функция : ChangeDisplaySettingsEx, вот ее описание :
 
function ChangeDisplaySettingsEx(lpszDeviceName: PWideChar; var lpDevMode: TDeviceMode; wnd: HWND; dwFlags: DWORD; lParam: Pointer): Longint; stdcall;
 
Вот например так она вызывается :
 
ChangeDisplaySettingsEx( PChar('\\.\DISPLAY2'), lDevMode, 0, CDS_UPDATEREGISTRY, 0);
 
все хорошо, все работает.
 
Но мне надо вызвать вот так, это пример из сишного кода :
 
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL).  
 
Вот в Delphi никак не могу реализовать похожий вызов, 2-ой параметр не как не получается передать ни nil, ни NULL.
 
Кто че скажет по этому поводу ???
 
 
 


----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 08:50 28-05-2009
   

Страницы: 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru