Форум: "Основная";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];
ВнизСкриншоты рабочего стола и окна приветствия Найти похожие ветки
← →
Alex22 (2009-02-17 15:41) [0]Здравствуйте.
Есть задача постоянно создавать скриншоты рабочего стола, как под каким-либо пользователем так и в окне Winlogon.
Более подробно вопрос описан тут: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=68586 , однако подходящего решения проблемы на том форуме так и не подсказали (при использовании Synchronize скриншот получается белым в Winlogon, а при использовании TCriticalSection все казалось бы работает, но при клике на форму, либо ее перетаскивании вылетает ошибка "Out of system resources").
Если не затруднит, прошу помочь с решением задачи.
← →
KSergey © (2009-02-17 17:20) [1]казалось бы, при чем тут Synchronize и TCriticalSection?
что-то мне говорит о том, что гугль должен подсказать кучу готовых программ по записи мультиков с монитора, вероятно в некоторых из них так же поддерживается запись и во время WinLogon
← →
Alex22 (2009-02-17 21:26) [2]
> что-то мне говорит о том, что гугль должен подсказать кучу
> готовых программ по записи мультиков с монитора
Готовое не подойдет, т.к. нужно реализовать именно собственное решение, которое вероятно в будущем будет расширяться.
Но вопрос не об этом, а о том, как решить данную задачу без вышеописанных недостатков?
← →
clickmaker © (2009-02-17 22:17) [3]а зачем Synchronize(SaveBmp);?
сохранение (асли в один и тот же файл) оберни в критическую секцию.
и не совсем понятно, что за форма, и зачем она нужна
← →
Alex22 (2009-02-17 22:37) [4]
> а зачем Synchronize(SaveBmp);?
Это я тестировал, при Synchronize при клике на форму ошибка не вылатает, но вместо скришота белый экран.
А если обернуть в критическую секцию, то скриншот получается, но при клике наформу, либо перетаскивании и в общем при взаимодействии с формой вылетает ошибка "Out of system resources". Вот я и ищу ответа как избежать этой ошбки.
ПС. Форма нужна, зачем, другой впрос.
← →
clickmaker © (2009-02-17 23:01) [5]> ошибка "Out of system resources".
скорей всего возникает при нехватке DC
меню, TreeView, ListView и прочие контролы на форме используются?
и все-таки: зачем нужна форма?
← →
clickmaker © (2009-02-17 23:07) [6]то есть, я намекаю на то, что где-то имеет место быть нефиговая утечка ресурсов
скорей всего, где-то не освобождается какой-то Bitmap или Canvas
← →
kami © (2009-02-18 00:15) [7]при помощи Synchronize SetThreadDesktop не отработает на Winlogon десктопе по причине
The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a handle to the current desktop)
Так как Synchronize выполняет код в контексте "основного" потока, содержащего, как я понял, кучу окон (GUI приложение).
Вывод: Synchronize убрать куда подальше и код, где инициализируется/уничтожается Bmp в студию, чтобы можно было говорить о утечке ресурсов более конкретно.
← →
KSergey © (2009-02-18 07:19) [8]> Alex22 (17.02.09 21:26) [2]
> Готовое не подойдет, т.к. нужно реализовать именно собственное решение, которое вероятно в будущем будет расширяться.
супер богатые велосипедисты... Ну взять какой-либо проект в исходниках, оно есть!
← →
Alex22 (2009-02-18 11:04) [9]Форма пока "голая", вот сам исходник: http://webfile.ru/2638381
← →
clickmaker © (2009-02-18 11:28) [10]сразу вопросы:
почему поток ServiceThread стартует по таймеру, а не организован цикл с задержкой внутри самого потока?
почему берем GetDC(GetDesktopWindow), а ReleaseDC(0 ?
← →
Alex22 (2009-02-18 12:30) [11]
> почему поток ServiceThread стартует по таймеру, а не организован
> цикл с задержкой внутри самого потока?
В данном случае это играет какую-то роль для решения задачи?
> почему берем GetDC(GetDesktopWindow), а ReleaseDC(0 ?
Да, несоответствие, но исправление на ReleaseDC(GetDesktopWindow,dc) ничего не дает.
← →
clickmaker © (2009-02-18 12:39) [12]> В данном случае это играет какую-то роль для решения задачи?
зачем лишний посредник в лице таймера?
while not Terminated do begin
SaveBmp;
Sleep(100);
end;
> исправление на ReleaseDC(GetDesktopWindow,dc) ничего не
> дает
под какой ОС нехватка ресурсов? На 2003 у меня нормально работает
← →
clickmaker © (2009-02-18 12:45) [13]а в режиме формы в отладчике по стеку вызовов при "Out of system resources" не видно, откуда оно выбрасывается?
← →
Alex22 (2009-02-18 12:53) [14]Тестирую под XP.
Ошибка возникает на строкеBmp.SaveToFile(ExtractFilePath(ParamStr(0))+"\screen_"+Format("%0.3d",[fr_num])+".bmp");
← →
clickmaker © (2009-02-18 13:02) [15]> Ошибка возникает на строке
а глубже-то не пробовал заходить?
← →
Сергей М. © (2009-02-18 13:03) [16]
> Alex22 (18.02.09 12:53) [14]
> hThread:=CreateThread(nil, 0,
Это кто ж тебе насоветовал использовать именно CreateThread ?
BeginThread следует использовать !
И что за солягка сборная из TThread и CreateThread ?
← →
clickmaker © (2009-02-18 13:10) [17]еще бы версию дельфи нефигово сказать. Потому что реализации SaveToFile могут отличаться
← →
Alex22 (2009-02-18 13:22) [18]
> Это кто ж тебе насоветовал использовать именно CreateThread
> ?BeginThread следует использовать !
В интернете откопал )), да и CreateThread/BeginThread там чисто для тестирования, а работать нужно заставить именно TThread.
ПС. Использую Delphi 7.
← →
Сергей М. © (2009-02-18 13:32) [19]
> В интернете откопал
Т.е. ты вообще не задавался мыслью выяснить, чем принципиально отличаются CreateThread от BeginThread и почему класс TThread создает поток вызовом именно BeginThread, а не CreateThread ?
Малацца, далеко пойдешь)
← →
Alex22 (2009-02-18 13:49) [20]А в чем состоит это различие (в нете покопался, но толкового разъяснения не нашел)?
← →
clickmaker © (2009-02-18 13:51) [21]> А в чем состоит это различие
BeginThread - правая кнопка - Find Declaration
← →
Сергей М. © (2009-02-18 13:54) [22]
> в чем состоит это различие
Основное - в см. справку по IsMultiThread = True
← →
Alex22 (2009-02-18 14:06) [23]
> Основное - в см. справку по IsMultiThread = True
ОК, сенькс за наводку, буду копать справку...
← →
Alex22 (2009-02-19 14:14) [24]И все таки, вопрос: можно как-то избежать ошибки при использовании CriticalSection (возникают при взаимодействии с формой)?
← →
Сергей М. © (2009-02-19 14:26) [25]А где у тебя такое обращение к форме ?
Цитируй фрагмент кода ..
← →
Alex22 (2009-02-19 14:38) [26]
procedure Get_Screen;
var
dc: hDC;
begin
DC:=GetDC(GetDesktopWindow); // Получаем дескpиптоp экpана
BitBlt(Bmp.Canvas.Handle,0,0,Screen.Width,Screen.Height,dc,0,0,SRCCOPY); // Копируем содержимое экрана
ReleaseDC(GetDesktopWindow,dc);
Bmp.SaveToFile(ExtractFilePath(ParamStr(0))+"\screen_"+Format("%0.3d",[fr_num])+".bmp");
end;
procedure TGet_ScreenThread.Execute;
begin
// Synchronize(SaveBmp);
CriticalSection.Enter;
inc(fr_num);
InitActiveDesktop;
Get_Screen;
CriticalSection.Leave;
end;
procedure TfrmServer.Timer3Timer(Sender: TObject);
begin
GetScrThrd:=TGet_ScreenThread.Create(true);
GetScrThrd.FreeOnTerminate:=true;
GetScrThrd.Resume;
end;
← →
Alex22 (2009-02-19 14:45) [27]В смысле пи клике на форму, перетаскивании и т.п.
← →
Сергей М. © (2009-02-19 14:48) [28]И где же обращение к форме ?
Ткни носом - в упор не вижу ..
← →
Alex22 (2009-02-19 14:53) [29]В данном коде нет, просто я поторопился...
Ну а во время работы программы (при клике на форму, ее перетаскивании и т.п.) возникает ошибка "Out of system resources".
Почему она возникакет и можно ее как-то избежать?
← →
Сергей М. © (2009-02-19 15:36) [30]И где же обращение к форме ?
Ткни носом - в упор не вижу ..
← →
Alex22 (2009-02-19 15:44) [31]
> И где же обращение к форме ?Ткни носом - в упор не вижу
Обращение - при клике на форму, ее перетаскивании и т.п.
← →
Сергей М. © (2009-02-19 15:55) [32]Я про программное обращение ..
Смотрю на твой юнит fServer и не вижу ни единого обращения к форме в контексте входа в крит.секцию
Да и зачем вообще тут нужна форма - это тоже совершенно не понятно..
← →
Alex22 (2009-02-19 16:11) [33]То что якобы форма пустая и вроде как пока не нужна - пока да, не нужна, но потом на ней будут размещены прочие элементы и т.п. ...В общем она нужна.
В том то и прикол, что программно к форме обращений после запуска таймера нет, однако при взаимодействии состороны (в будущем оно будет, изменение настроек и т.п.) вылетает ошибка, что нехорошо.
Вот я и бъюсь с ее решением.
Вы моджете подсказать отностиельно тех же критических секций, что нужно сделать чтобы ошибка не возникала, без использования всяких try...except и т.п.? И почему они вообще возникают?
Я понимаю что дествительно тратися много ресурсов, но при Synchronize то такого не происходит, но к сожалению по ранее описанной причине его использовать не могу.
← →
clickmaker © (2009-02-19 16:19) [34]> [33] Alex22 (19.02.09 16:11)
отследи в отладчике, где именно в коде VCL вылетает EOutOfResources
← →
Eraser © (2009-02-19 16:22) [35]> [33] Alex22 (19.02.09 16:11)
ты идешь по тупиковому пути. в висте это работать не будет. там другой подход.
← →
Eraser © (2009-02-19 16:24) [36]для взаимодействия с пользователем в логон-экране предусмотрены спец. средства. в XP это GINA.dll, в Vista - ICredentialProvider.
← →
Alex22 (2009-02-19 16:27) [37]
> clickmaker ©
На сохранении картинки - Bmp.SaveTofile...
> Eraser © (19.02.09 16:22) [35]
А какой в Висте подход?
И как тогда грамотно реализовать данную задачу?
← →
Eraser © (2009-02-19 16:29) [38]если есть несколько потоков, использующих TBitmap - работать с ним нужно очень осторожно. во-первых, при любом ображении блокировать с помощью внутреннего механизма блокировки - TBitmap.Canvas.Lock; во-вторых, некоторые системные сообщения могут приводить к краху приложения, если оно использует TBitmap в доп. потоках (эти сообщения нужно блокировать).. все из-за кривизны рук у создателей Graphics в VCL.
← →
Сергей М. © (2009-02-19 16:30) [39]
> В общем она нужна
Зачем сервису форма ?
У сервисов иные задачи - делать свое дело тихо-незаметно, без шума и пыли, никому не мешая и не обнаруживая свое присутствие.. На то они и сервисы, "демоны" по-линуксоидному, что, кстати, весьма точно отражает суть и назначение фоновых служб
Форма очевидна в обычном GUI-приложении, но никак не в сервис-приложении !
Ну так я не понял - ты убрал CreateThread ? Заменил на TThread или BeginThread ?
Мало того, ты же в теле ф-ции ServiceThread() лезешь к синхронизируемому ресурсу напрямую, безо всяких крит.секций !
← →
clickmaker © (2009-02-19 16:31) [40]> На сохранении картинки - Bmp.SaveTofile...
для кого я подчеркнул? в коде VCL
Use debug dcu и зайди отладчиком туда
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.005 c