![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 27.07.2015
Сообщений: 10
|
![]()
Здравствуйте, граждане программеры.
Вопрос: как получить СкринШот из вторичного потока? Получение скринов в основной программе задача простая. Одна из функций Вызов данной функции , след (и все это работает из основного потока без вопросов): Код:
получение скриншотов из вторичного потока, не кАтит. Получаю белый или черный квадрат (проверял на разных осях Serv2003, XP, W7) Т.е., имея след поток Код:
Как получить стабильный скриншот экрана из вторичного потока? Все методы функций скриншотов из DRKB3_Full.chm мною перепробованы и работают гарантированно из основного потока! |
![]() |
![]() |
![]() |
#2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Хм... BitBlt() это функция WinAPI и ее не через Try нужно проверять а через If.
проверь что она возвращает: Код:
I'm learning to live...
|
![]() |
![]() |
![]() |
#3 |
Цифровой кот
Старожил
Регистрация: 29.08.2014
Сообщений: 7,629
|
![]()
Вот кусок кода из Delphi Works:
Код:
Попробуй вызвать её из потока. Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 27.07.2015
Сообщений: 10
|
![]()
Спасибо добрым людям, что отозвались. Однако...
Код, что подсказали выше, я переделал, без использования громоздкого пакет библиотек DelphiWorks, получалось это: Код:
Концепция создаваемого приложение - использование DataSnap технологии (Delphi XE2) Создается клиент-серверное приложение. Одной из функций приложения - получение удаленных Скрин Шотов. в модуле серверных методов, объявлен метод GetStream, который возвращает поток (это может быть скриншот (битмап записанный в МемСтрим), это может быть ClientDataSet (предварит созданный и записанный в мем стрим), это может быть наконец просто файл, открытый с флагом fmShareDenyNone) Код:
он , по запросу клиента, должен возвратить скрин экрана, процедура скринШота не всегда срабатывает и возвращает скриновый поток. Наблюдается ошибка при выполнении функции BitBlt. Так для функции function MakeMonitorShapshot(Bitmap: cl.Graphics.TBitMap; var err: string): boolean; код ошибки GetLastError() = 6 // т.е. неверный дескриптор а для очередной (наверное 8 разновидности получения мною скрина) Код:
Возможно кто-то знает нюансы использования злосчастной функции? Решение этой траблы (получен серина на любой удаленной машине) у меня то есть: сервер приложения DataSnap в основном потоке в глобальной переменной типа битмап через 5 сек постоянно обновляет скрин. А серверный метод, при поступлении запроса от клиента, лишь сохраняет БитМап в создаваемый поток в памяти и возвращает его клиенту... Но это решение какое-то кривое.... |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 27.07.2015
Сообщений: 10
|
![]() |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 27.07.2015
Сообщений: 10
|
![]()
Ну что, решение я нашел. И оно след:
Вам надо из вторичного потока получить стабильный скрин шот. Чтож... мне точно известно, что его можно получить только если процедура получения скрина вызвана из основного потока. Поэтому : - из вторичного потока увеличиваем глоб переменную типа integer на 1 InterlockedIncrement(GlobalVarInteg er), вызываем Sleep(200) циклично, проверяя, что бы GlobalVarInteger стал = 0 - из основного потока в методе Идл (TApplicationEvents.OnIdle), так же тестируем эту переменную, и если она стала >0 формируем скриншот, и записываем его в глоб переменную типа TBitMap, сбрасываем GlobalVarInteger:= 0; - во вторичном потоке произойдет выход из цикла и можно из глобального битмапа изображение сохранять на диск или передавать потоком куда дальше с битмапом надо обращаться(из осн и вторичных потоков, если их несколько) через объекты синхорнизации (tCriticalsection или TMonitor.Enter(globalBMP)/TMonitor.Exit) Последний раз редактировалось Dimitr69; 18.01.2016 в 16:21. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как получить доступ к методу потока(TThread) из основного потока? | Pcrepair | Общие вопросы Delphi | 3 | 30.03.2013 14:52 |
спонтанная ошибка при синхронизации потока Thread и основного приложения(Посылка сообщений) | Человек_Борща | Общие вопросы Delphi | 2 | 14.05.2011 22:25 |
THTTPCli, обработчик события выполняется в контексте основного потока | profaller | Работа с сетью в Delphi | 4 | 08.02.2011 16:25 |
Менеджер рабочего стола | Kreadlling | Общие вопросы C/C++ | 0 | 08.10.2009 19:35 |
скриншоты рабочего стола | Alar | Общие вопросы Delphi | 0 | 29.10.2006 10:59 |