Форум: "Прочее";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
ВнизСупер-пупер-мега-сплэш Найти похожие ветки
← →
Юрий Зотов © (2009-08-17 21:38) [0]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1411
Прошу понять меня правильно - это не реклама и не пиар, а информация для использования в своих проектах всеми желающими.
← →
Юрий Зотов © (2009-08-17 21:49) [1]Забыл добавить - мысль написать эту статью была навеяна веткой
http://delphimaster.net/view/1-1249326627/
и одним из старых проектов, в котором заставка именно так и была сделана - без VCL и в отдельном потоке.
← →
@!!ex © (2009-08-17 21:52) [2]Так эта, есть же сплэш от Andy... правда ссылку запамятовал, хорошо работает...
← →
Юрий Зотов © (2009-08-17 21:58) [3]> @!!ex © (17.08.09 21:52) [2]
Я думаю, что разных сплэшей - море. Но в том проекте, откуда был выдернут этот пример, сплэш по ряду причин был нужен слишком специфический, поэтому пришлось писать свой. Прочитав ветку Стаса я о нем вспомнил - ну и решил выложить. Упростив, конечно.
← →
KilkennyCat © (2009-08-17 22:07) [4]
> Юрий Зотов ©
Главное - вовремя! На днях понадобится. Спасибо, с меня пиво.
← →
Суслик_ (2009-08-17 22:54) [5]
> KilkennyCat © (17.08.09 22:07) [4]
>
>
> > Юрий Зотов ©
>
> Главное - вовремя! На днях понадобится. Спасибо, с меня
> пиво.
Ты еще до Москвы доедь.
Дядя Юра. Я еще потерзаю твой сплеш. Мой, собака, дергается (мне на сплеше еще нужно было информацию обновлять) - не до конца, я видимо, филосовию invalidaterect просек. Поэтому буду учиться у тебя. Пиво самой собой.
← →
Суслик_ (2009-08-17 22:57) [6]Забыл смайлики добавить для обоих.
:)
и
:)
← →
KilkennyCat © (2009-08-17 23:02) [7]
> Суслик_ (17.08.09 22:54) [5]
ну, эт не проблема... через месяц снова буду проезжать...
← →
oldman © (2009-08-17 23:29) [8]Прилагаемый архив содержит 3 каталога:
Source (исходники DLL и демо-проекта) ;
Bin (откомпилированные в Delphi 7 DCU — реально не нужны, но так принято);
Release (DLL и демо-проект — можно сразу запустить и посмотреть).
Архив-то где?
:)))))))))))))
← →
oldman © (2009-08-17 23:30) [9]Пардон, я тормоз!
:)
← →
TIF © (2009-08-17 23:51) [10]Вчера увидел заголовок статьи на королевстве... Подумал что старая, на дату внимания не обратил. Сегодня увидел здесь тему, понял что она новая, пошёл читать )))
> Готовим картинку в формате BMP и обзываем ее файл SplashBmp.
> bmp
Ну для примера нормально, но на практике BMP - это зверско. Лучший вариант - PNG: и без искажения, и размер маленький, особенно если через PngCrush пропустить, "пробрутив" все варианты сжатия:pngcrush-1.6.15.exe -rem alla -reduce -brute image_input.png image_output.png
И альфа-канал есть (хотя BMP с прозрачностью тоже в D2010 поддерживается).
Вариант похуже - JPG. Минусы: качество не оригинальное + размер может быть больше чем у PNG-шки. Плюс: размер может быть меньше PNG-шки :)
← →
Andy BitOff © (2009-08-18 00:18) [11]Ну а всё-таки прорекламируюсь =)
Моя реализация сплэша - http://bitoff.ru/asf-main
← →
Юрий Зотов © (2009-08-18 08:37) [12]Надо же - пример неожиданно превратился в коммерческий проект. Уже целых 2 пива заработал.
:o)
← →
ZeroDivide © (2009-08-18 08:39) [13]1. Не нужна отдельная dll для этого
2. написан без VCL (ради объема и скорости). Использовать WinApi, на мой взгляд, смысла нет... При компиляции к exe-шнику объем не сильно увеличится, а скорость... ну какая нафиг скорость? Борьба за сотые миллисекунды?
3. Такая сплеш - не модно. Модно чтобы че-нить выпирало, сверкало, отбрасывало полупрозрачные тени и т.п.
← →
Дмитрий С © (2009-08-18 08:55) [14]
> ZeroDivide © (18.08.09 08:39) [13]
+1
имхо пафосное фуфло
← →
Дмитрий С © (2009-08-18 09:01) [15]http://www.sakhgu.ru/vid/shlash.jpg
Ито лучше
← →
Хитрий Лис (2009-08-18 09:49) [16]Спасиба дядь Юра :)
У самого руки не доходили скомпилить все идеи вместе...
А есть ли желание собрать свои мелкие утилитки на одну страничку - как это сделано у Игоря или у Розыча ?
← →
Юрий Зотов © (2009-08-18 09:51) [17]> Дмитрий С © (18.08.09 08:55) [14]
Дмитрий, а Вам никогда не приходила в голову простая мысль о том, что при высказывании своего мнения выражения все же следут выбирать?
Жаль. Я был о Вас лучшего мнения.
← →
test © (2009-08-18 10:02) [18]Юрий Зотов ©
А эффект какие есть?
← →
Хитрий Лис (2009-08-18 10:04) [19]
> Юрий Зотов © (18.08.09 09:51) [17]
> Дмитрий, а Вам никогда не приходила в голову простая мысль ...
Не судите так строго - мальчики в нежном возрасте всегда хотят казаться старше... в данном случае имееи подражание тёме леблядеву...
Еще заметил странную особенность - чем лучше сплеш - тем более пустая и малофункциональная сама програмка :)
← →
Павел Калугин © (2009-08-18 10:09) [20]Юрий Сергеич, спасибо, бум изучать:)
← →
test © (2009-08-18 10:10) [21]Хитрий Лис (18.08.09 10:04) [19]
The Bat? ))
← →
MsGuns © (2009-08-18 10:12) [22]ИМХО, картинка в качестве заставки - все равно что телесетка. При достаточно долгом процессе загрузки и инициализации приложения предпочтительнее на заставке отображить информацию о текущем процессе хоть простым текстом, который меняется при переходе од одной стадии загрузки к другой (как в 1С например). В этом случае пользователь видит, что прога не "висит", а работает и даже более того - как скоро она "раздуплится". Было бы классно, если б была возможность поверх картинки (если уж без нее никуда) можно было бы писать нужный текст.
← →
test © (2009-08-18 10:17) [23]MsGuns © (18.08.09 10:12) [22]
Тогда надо создать окно на основном, которое изображает из себя бегунок, текст рисовать dc основного окна, и функцию написать чтобы текст в DC писала и бегунок двигала. Сохранение после общей перерисовки туда же. VCL то нет, кстати никак не могу понять чем VCL не устраивает?
← →
Andy BitOff © (2009-08-18 10:18) [24]
> MsGuns © (18.08.09 10:12) [22]
Всё уже укарадено до нас ;)
← →
Skyle © (2009-08-18 10:21) [25]Не надо показывать никаких окон вообще. При запуске программы надо сворачивать все окна и рисовать прогресс загрузки прямо на десктопе на любимой картинке пользователя.
← →
Хитрий Лис (2009-08-18 10:32) [26]
> test © (18.08.09 10:10) [21]
> Хитрий Лис (18.08.09 10:04) [19]
> The Bat? ))
Может вы будете смеятся - но да.
Считаю что лучшей версией TheBat была 1.4 или 1.7 точно не помню уже... Начиная с версии 2.0 TheBat стал более тормознутым, а начиная с версии 3.0 ко всеобщей торомзнутости добавились периодические проблемы с IMAP. Более старших уже и не видел - вся контора перешла на Thunderbird.
> MsGuns © (18.08.09 10:12) [22]
> При достаточно долгом процессе загрузки и инициализации приложения предпочтительнее на заставке отображить информацию о текущем процессе хоть простым текстом...
Вам наверняка нравиться процесс загрузки Линукса :) Еще в ранних версиях игрушек от id-Software было такое окно загрузки... мне нравилось.
> Skyle © (18.08.09 10:21) [25]
> Не надо показывать никаких окон вообще. При запуске программы надо сворачивать все окна и рисовать прогресс загрузки прямо на десктопе на любимой картинке пользователя.
Хорошая идея кстати - только вот сворачивать нужно не все окна - а свою программу - и сигнализировать о полной загрузке миганием значка в трее :)
← →
MsGuns © (2009-08-18 10:35) [27]И еще один минус картинки. Как я понял, Юрий предложил свое решение как УНИВЕРСАЛЬНЫЙ метод для разных приложений. В этом случае не кажется ли не совсем удачным рисование одной и той же картинки при запуске совершенно разных приложений. Допустим, я запускаю сразу три проги: бухгалтерскую, какую-нибудь "Планирование ресурсами" и "Анализ сетевого трафика" и вижу на мониторе три одинаковые картинки.
Я не критикую, ни Боже мой. Просто таким неуклюжим методом пытаюсь сподвигнуть Мастера на очередное оригинальное решение, коим тут же и воспользуются. И я в том числе :)
← →
test © (2009-08-18 10:36) [28]Хитрий Лис (18.08.09 10:32) [26]
В doom I, II красиво было консоль и процент загрузки wad файлов, в консоле.
← →
@!!ex © (2009-08-18 10:39) [29]Ребят, все что вы обсуждаете уже реализовано. ССылка в [11].
Сорсы открытые.
← →
Медвежонок Пятачок © (2009-08-18 10:39) [30]все это полумеры.
надо при запуске вообще ничего не запускать.
прописываться в авторан, делать ребут, подменив обои и сам сплэш винды:
"Внимание, сечас комп перегрузится и будет запущена моя мегапрограмма"
← →
Юрий Зотов © (2009-08-18 10:40) [31]> MsGuns © (18.08.09 10:12) [22]
Сергей, видимо, Вы не прочитали обсуждение и поэтому приняли пример за реальную программу.
:o)
Разве что-то мешает доработать этот пример? Ввести прогрессбар, эффекты и вообще что угодно?
Вот этот сплэш в реальном проекте:
http://webfile.ru/3848164
Как видите, с прогрессбаром.
==================
> All
Поясняю:
1. Ставилась цель сделать сплэш с нормальной прорисовкой. Всего лишь.
2. DLL была использована в качестве кода, разделяемого несколькими проектами. То есть - код один, а сплэши он может показывать разные и сколько угодно.
3. По ряду объективных причин (не только ради объема и скорости) было принято решение не использовать VCL.
4. Не стоит принимать пример за реальную программу.
5. Кто считает такое решение нормальным - может его использовать (или доработать по своему вкусу). Кто считает такое решение НЕ нормальным - может его НЕ использовать. Чес-слово, я не возражаю.
6. В любом случае хамство я считаю недопустимым. Для выражения своего мнения существуют нормальные слова и нормальный тон.
7. Все.
← →
Юрий Зотов © (2009-08-18 10:47) [32]> MsGuns © (18.08.09 10:35) [27]
> Допустим, я запускаю сразу три проги:... и вижу на мониторе
> три одинаковые картинки.
Люди, ну включите же голову, наконец! Ну кто вам мешает закомпилить картинку в экзешник, в нем же ее загрузить и передать хэндл картинки в DLL через параметры функции ShowSplash?
Неужели сложно? Там же доработок - на пять минут.
← →
Дмитрий С © (2009-08-18 10:47) [33]
> 5. Кто считает такое решение нормальным - может его использовать
> (или доработать по своему вкусу). Кто считает такое решение
> НЕ нормальным - может его НЕ использовать. Чес-слово, я
> не возражаю.
очень объективный аргумент
> 6. В любом случае хамство я считаю недопустимым. Для выражения
> своего мнения существуют нормальные слова и нормальный тон.
>
>
вот именно
← →
MsGuns © (2009-08-18 11:00) [34]>Юрий Зотов © (18.08.09 10:47) [32]
>Люди, ну включите же голову, наконец! Ну кто вам мешает закомпилить картинку в экзешник, в >нем же ее загрузить и передать хэндл картинки в DLL через параметры функции ShowSplash?
>Неужели сложно? Там же доработок - на пять минут.
Вы предложили идею или пример реализации идеи ? Если первое, то я могу предложить построить дом, выставив в качестве идеи кирпич и цемент. А дальше - "включайте голову". Если второе, то как бы подразумевается и сам процесс "строительства". Без обоев и люстр, но строительство ГОТОВОГО дома, пусть и не дворца.
← →
Юрий Зотов © (2009-08-18 11:01) [35]> Дмитрий С © (18.08.09 10:47) [33]
Это вместо "извините"?
Что ж, тем более жаль.
← →
Юрий Зотов © (2009-08-18 11:04) [36]> MsGuns © (18.08.09 11:00) [34]
Я предложил пример реализации сплэша с нормальной перерисовкой. Всего лишь. На новизну решения не претендую, поскольку ее и нет.
← →
Andy BitOff © (2009-08-18 11:07) [37]
> Юрий Зотов © (18.08.09 11:01) [35]
Да, Юрий. Вот я тоже, когда начинают ворчать мол, это не то и это не так, говорю: "Я же отдаю сырцы, делайте что хотите, а не нравится не пользуйтесь вообще", так ведь нет, еще и обижаются. Доходит до того, что я, типа обязан делать как они хотят.
← →
MsGuns © (2009-08-18 11:09) [38]Хорошо, тогда конкретизитрую вопрос:
Чем предложенный Вами способ лучше (оптимальнее, быстрее, эффективнее и т.д.) "классического", приведленного почти во всех учебниках Дельфи ?
← →
MsGuns © (2009-08-18 11:13) [39]>Andy BitOff © (18.08.09 11:07) [37]
Не надо выдумывать. Где тут было ворчание, не говоря уже об обиде ?
Была попытка предложить привести более гибкую реализацию, действительно полезную в реальных проектах.
← →
Andy BitOff © (2009-08-18 11:15) [40]
> MsGuns © (18.08.09 11:09) [38]
> Хорошо, тогда конкретизитрую вопрос:Чем предложенный Вами
> способ лучше (оптимальнее, быстрее, эффективнее и т.д.)
> "классического", приведленного почти во всех учебниках Дельфи?
А можно глянуть на пример классической реализации? Или имеется ввиду пример из демок?
← →
Andy BitOff © (2009-08-18 11:16) [41]
> MsGuns © (18.08.09 11:13) [39]
> Была попытка предложить привести более гибкую реализацию, действительно полезную в реальных проектах.
Дык, сделано уже. Вроде говорили...
← →
Павел Калугин © (2009-08-18 11:17) [42]
> Была попытка предложить привести более гибкую реализацию,
> действительно полезную в реальных проектах.
Без предложения обю оплате? странно.
← →
Anatoly Podgoretsky © (2009-08-18 11:19) [43]> Медвежонок Пятачок (18.08.2009 10:39:30) [30]
Напоминает вирус.
Внимание, сейчас винчестер будет отформатирован.
Вы согласны продолжать.
При нажатие хто на ОК, хоть на CANCEL - поздно, все равно буду форматировать.
← →
Юрий Зотов © (2009-08-18 11:20) [44]> Andy BitOff © (18.08.09 11:07) [37]
Да я вообще почти в шоке. Не ожидал даже. Казалось бы - что тут обсуждать-то? Есть пример, есть сырцы, хочешь - используй, хочешь - докрути как нравится, не хочешь - не используй совсем... так нет же...
Блин... сайт мастаков - это, конечно, круто. В любом чихе немедленно обнаруживается проблема - и начинается обсуждение на полтыщи постов... да еще и с неадекватным (мягко говоря) поведением некоторых...
> MsGuns © (18.08.09 11:09) [38]
Только тем, что сплэш работатет в своем собственном потоке и поэтому прорисовается гарантированно нормально, как бы сильно ни был загружен основной поток программы (и все остальные, если они в ней есть).
← →
b z (2009-08-18 11:20) [45]Плохо то, что оснавная форма "прячется".
Запускаю к примеру из проводника, Splash нормально, оснавная, за проводником.
← →
Anatoly Podgoretsky © (2009-08-18 11:23) [46]> MsGuns (18.08.2009 11:09:38) [38]
А должен?
Это же совсем не обязательно, при предложение своей реализации.
← →
Andy BitOff © (2009-08-18 11:23) [47]
> MsGuns © (18.08.09 11:13) [39]
> Где тут было ворчание, не говоря уже об обиде ?
Ну, имелось в виду, что мы не художники и делаем демки как умеем, а юзер часто сразу не видит потенциал и не понимает, что это только демонстрация возможностей, да и то порой не всех.
Это не к вам лично, это так, наболевшее ;)
Вот и Юрий выдал только идею того как сделать не виснущий сплэш и кратенькую реализацию этого, все остальное программисту в руки.
А если интересует законченный вариант, чтобы нарисовал, подключил к проекту и миним манипуляций для работы, так я давал ссылку выше.
← →
cwl © (2009-08-18 11:25) [48]Юрию - спасибо за идею и начало реализации, дальше сам докручу :>
реакция некоторых присутствующих отвратительная и нездоровая. противно, честное слово ..
← →
Юрий Зотов © (2009-08-18 11:26) [49]> b z (18.08.09 11:20) [45]
Она не за проводником, ее вообще нет на экране. И кнопки приложения на таскбаре тоже нет. Там стоит Sleep (10000) - это имитация длительной загрузки. И как только эта загрузка закончится - так появляются главная форма и кнопка приложения, а сплэш исчезает.
← →
b z (2009-08-18 11:30) [50]
> Юрий Зотов © (18.08.09 11:26) [49]
Не, вы не поняли, все нормально, ожидает как и положено, только вот потом, главная "спряталась", и кнопка на таскбаре не активная.
← →
MsGuns © (2009-08-18 11:33) [51]Дело не в ворчании и не в критике неизвестно чего на полтыщи постов, а совсем ином.
Вся штука в том, как вообще подходить к идее сплэша. Вот, к примеру, подавляющее большинство "базовых" программ при загрузке непременно лезут в базу, открывая сразу несколько запросов к разным таблицам. При достаточно больших объемах информации или медленной сетке такая загрузка порою длится минуты, а то и десятки минут (та же 1С). При этом не исключено, что пользовател случайно кликнул не ту иконку и теперь вынужден тупо жевать, дожидаясь пока прога раздуплится. Не проще ли загружать приложение, а открытие базы выполнять по "кнопке" ?
Пользователя не шибко затруднит такое "лишнее" нажатие, зато работа с таким приложением много приятнее и интуитивно понятнее, нежели неявное автооткрытие всего и всякого.
Хотя, допускаю, что это явно выходит за рамки сабжа. Однако ж навеяло :)
← →
Юрий Зотов © (2009-08-18 11:36) [52]> b z (18.08.09 11:30) [50]
Хм... действительно. Интересно, что в реальной программе (откуда был выдран этот код) такого эффекта нет. Видимо, что-то недовыдрал... посмотрю повнимательнее.
← →
Andy BitOff © (2009-08-18 11:43) [53]
> MsGuns © (18.08.09 11:33) [51]
Да, есть такое. Однако не везде. Есть программы, которым сплэш необходим и заставлять юзера кликать по кнопкам, которые должны кликаться автоматом при старте тоже не выход.
← →
MsGuns © (2009-08-18 11:45) [54]Мне непонятна реакция на реакцию :) Кому то странно, кому-то противно..
Мы в божьем храме, где вообще только слушают или на программерском форуме "Потрепаться" ?
Нам читают молитву или предлагают собственные идеи реализации чего-то ?
Если человек публикует свои наработки (идея - это та же наработка), то он и ожидать соответствующей реакции должен, не так ли ? В том числе и от тех, кто узрел в идее недостатки, возможно мнимые, но не лучше ли спокойно объяснить ему в чем он заблуждается приведя РЕШЕНИЕ, а не вставать в позу недоумения по поводу выключенных голов ?
Вот мне лично непонятно чем предложеный "фоновый" способ лучше обычного, БАНАЛЬНО реализуемого с помощью обычной продизайненной формочки и нехитрой манипуляции с dpr.
Был бы весьма признателен, если бы мне доступно объяснили это.
← →
Юрий Зотов © (2009-08-18 11:45) [55]> MsGuns © (18.08.09 11:33) [51]
> Не проще ли загружать приложение, а открытие базы выполнять
> по "кнопке" ?
Не всегда так можно сделать, все зависит от архитектуры программы. Например, та, о которой я здесь уже упоминал, умеет загружать главную форму из БД (то есть, каждый юзер при его желании может иметь свою собственную главную форму).
Кроме того, инициализация главного меню и кнопок тулбаров тоже часто делается в соответствии с грантами юзера.
← →
Andy BitOff © (2009-08-18 11:52) [56]
> MsGuns © (18.08.09 11:45) [54]
> Вот мне лично непонятно
> чем предложеный "фоновый" способ лучше обычного, БАНАЛЬНО
> реализуемого с помощью обычной продизайненной формочки и
> нехитрой манипуляции с dpr.Был бы весьма признателен, если
> бы мне доступно объяснили это.
Сергей, чего не понятного-то? Поставьте в главной форме sleep(5000) и перекройте сплэш другим окном, я уже не говорю о реализации прогрессбара, который просто остановится.
← →
Юрий Зотов © (2009-08-18 11:52) [57]> MsGuns © (18.08.09 11:45) [54]
> Вот мне лично непонятно чем предложеный "фоновый" способ лучше
> обычного, БАНАЛЬНО реализуемого с помощью обычной продизайненной
> формочки и нехитрой манипуляции с dpr.
> Был бы весьма признателен, если бы мне доступно объяснили это.
Запустите такой БАНАЛЬНЫЙ проект и во время показа сплэша "повозите" по нему другим окном. От красоты и следа не останется (вернее, только след как раз и останется).
Если Вас такое поведение сплэша устраивает - ради бога, это Ваше полное право. А меня - не устраивает, и это тоже мое полное право. Спорить тут не о чем, это будет спор о вкусах.
← →
MsGuns © (2009-08-18 11:55) [58]Все понятно. Ясно и предельно конкретно.
Спасибо за пояснение - идея, действительно, полезная.
← →
test © (2009-08-18 11:58) [59]Юрий Зотов © (18.08.09 11:52) [57]
Поставьте на форму обрабатывать перерисовку флаг и можно возить по окну чем угодно.
← →
MsGuns © (2009-08-18 12:00) [60]Кстати, а если перерисовку "банального" сплэша-формы тоже делать по таймеру ?
← →
Юрий Зотов © (2009-08-18 12:01) [61]> test © (18.08.09 11:58) [59]
> Поставьте на форму обрабатывать перерисовку флаг и можно
> возить по окну чем угодно.
Увы... я не умею этого делать. Был бы признателен за примерчег...
:o)
← →
Юрий Зотов © (2009-08-18 12:06) [62]> MsGuns © (18.08.09 12:00) [60]
Да хоть по трем таймерам. Один поток ПРИНЦИПИАЛЬНО не умеет делать два дела одновременно, в этом весь затык и есть. Поэтому, пока он занят, например, работой с БД, сообщения таймера будут накапливаться в его очереди, а обрабатываться не будут.
← →
Rouse_ © (2009-08-18 12:38) [63]Юр, я бы немного подправил процедуру отрисовки, ибо великие вещают нам:
A window may receive internal paint messages as a result of calling RedrawWindow with the RDW_INTERNALPAINT flag set. In this case, the window may not have an update region. An application should call the GetUpdateRect function to determine whether the window has an update region. If GetUpdateRect returns zero, the application should not call the BeginPaint and EndPaint functions.
Ну а по поводу того что окно скрывается после скрытия сплэша - то тут просто логическая ошибка в коде. НужноSetWindowPos(Wnd, HWND_TOP
заменить на ShowWindow(Wnd, SW_SHOWNA).
ЗЫ: незачто :)
← →
antonn © (2009-08-18 12:40) [64]ну и я тогда пиарнусь, со своей корявой в реализации заставкой :)
скрин: http://desksoft.ru/forum/attachments/19518f6778e41afe8d08067e688acfe9.jpg
урл: http://desksoft.ru/index.php?forum=13&th=187&w
думаю несложно будет заставку Юрия при необходимости загламурить :)
← →
Хитрий Лис (2009-08-18 12:44) [65]Не пойму - чего такие агрессивные нападки на полезную вещь ... пострелять бы...
← →
antonn © (2009-08-18 12:47) [66]
> Не пойму - чего такие агрессивные нападки на полезную вещь
завидно, что не только написал, но и рассказал об этом, да еще на ДК :)
← →
test © (2009-08-18 12:54) [67]Юрий Зотов © (18.08.09 12:01) [61]
Первое что приходит на ум
Application.ProcessMessages();
но не много не то сейчас поищу.
← →
Andy BitOff © (2009-08-18 12:56) [68]
> test © (18.08.09 12:54) [67]
Не ищи. Без доп.потока не обойдешся.
← →
Anatoly Podgoretsky © (2009-08-18 12:57) [69]> MsGuns (18.08.2009 12:00:00) [60]
Что бы таймер работал, нужно опрашивать сообщения, а какой опрос при скажем длительном синхронном запросе к БД, поток простое и надежное решение.
← →
test © (2009-08-18 13:27) [70]Andy BitOff © (18.08.09 12:56) [68]
Да похоже на то.
← →
Leonid Troyanovsky © (2009-08-18 13:55) [71]
> Rouse_ © (18.08.09 12:38) [63]
> заменить на ShowWindow(Wnd, SW_SHOWNA).
Если щелкнуть мышкой по этому окну, то стартуемое приложение
снова станет non foreground. Т.е., где-то под конец нужно что-то вроде
SetForegroundWindow(Application.Handle).
--
Regards, LVT.
← →
Leonid Troyanovsky © (2009-08-18 14:08) [72]
> ZeroDivide © (18.08.09 08:39) [13]
> 2. написан без VCL (ради объема и скорости). Использовать
> WinApi, на мой взгляд, смысла нет...
Показу формы в потоке до показа основной формы препятствует
Application.UpdateVisible при CreateNew.
В TApplication & TScreen оверридить нечего, поэтому апишное окно
вполне уместно.
--
Regards, LVT.
← →
Дмитрий С © (2009-08-18 14:10) [73]Переборщил с тоном, спасибо что отреагировали как положено. Извините.
А если нормальным тоном и по существу, то layered окошки не нуждаются в потоке и даже обработке сообщений в принципе. Дают переменную альфу, работают с 2000вин как минимум. Почему бы не воспользоваться этим?
← →
antonn © (2009-08-18 14:13) [74]
> Почему бы не воспользоваться этим?
>
основной минус - на них не рисуются контролы, на некоторых сплешах они нужны.
Ну и плюс многие привыкли к "колхозному" VCL, а тут нужно графику делать :)
← →
Andy BitOff © (2009-08-18 14:13) [75]
> Дмитрий С © (18.08.09 14:10) [73]
И пример, конечно, есть?
← →
Andy BitOff © (2009-08-18 14:15) [76]
> Дмитрий С © (18.08.09 14:10) [73]
А, все. Понял о чем.
> antonn © (18.08.09 14:13) [74]
Основное можно ручками...
← →
Дмитрий С © (2009-08-18 14:16) [77]
>
>
> > Почему бы не воспользоваться этим?
> >
>
> основной минус - на них не рисуются контролы, на некоторых
> сплешах они нужны.
> Ну и плюс многие привыкли к "колхозному" VCL, а тут нужно
> графику делать :)
>
>
Там же на винапи:) вкла нет. А строчку можно самому вывести или прогрессбар.
← →
antonn © (2009-08-18 14:17) [78]
> Основное можно ручками...
я бы даже сказал - все нужно ручками :)
никак не доведу свой TEdit с выводом в битмап и кнопки для таких вещей :(
← →
Дмитрий С © (2009-08-18 14:19) [79]
> А, все. Понял о чем.
>
На картинке я привел. Могу из проекта достать.
Кстати плюс такого окошка, что можно сделать возможность кликать "сквозь" него
← →
Andy BitOff © (2009-08-18 14:22) [80]
> Дмитрий С © (18.08.09 14:19) [79]
> Могу из проекта достать.
Не, ненадо, у меня своё есть ;)
← →
Дмитрий С © (2009-08-18 14:27) [81]
>
> Не, ненадо, у меня своё есть ;)
У ЮЗ тоже было свое:)
← →
Anatoly Podgoretsky © (2009-08-18 14:32) [82]> Дмитрий С (18.08.2009 14:27:21) [81]
А теперь стало общее, вот так и теряют собственность.
← →
Andy BitOff © (2009-08-18 14:39) [83]
> Дмитрий С © (18.08.09 14:27) [81]
Я на своё давал ссылку выше. Могу повторить - http://bitoff.ru/asf-main
← →
antonn © (2009-08-18 15:02) [84]
> Andy BitOff © (18.08.09 14:39) [83]
там в самой первой демке у текста тень другого цвета задай, а то осталась зеленая :)
← →
Andy BitOff © (2009-08-18 15:09) [85]
> antonn © (18.08.09 15:02) [84]
Антон, ты же знаешь, у меня с этими сплэшами вечно проблема, ну не умею я рисовать... ;)
Там в демке так задается, уж и не знаю зачем и почему. =)
← →
Smile (2009-08-18 15:18) [86]Опять какая-то странноть. В ветке принимает участие куча модераторов, а она до сих пор жива...
Непорядок
:)
Действительно, пора закрыть эту "потрепаловку"
← →
Юрий Зотов © (2009-08-18 15:31) [87]> Дмитрий С © (18.08.09 14:10) [73]
ОК, нет проблем. Тем более, что тоже правильно среагировали.
← →
Суслик_ (2009-08-18 17:51) [88]От себя добавлю.
Тут когда-то Димка Логинов выкладывал свой пример прогресс бара с доп. потоке. Я тогда решил поизучать его пример, заодно и столкнулся первый раз с окнами на винапи. Я его, помню, покритиковал немного, но евоный пример после доработки заюзал (спасибо, Дима).
Достоинство в том, что окошко с сообщением и прогрессбаром всегда видно и даже реагирует на нажатие мышкой пока основной поток рубится в дум с БД.
Юра, спасибо - хороший пример.
ЗЫ Забавно смотреть как народ тупит немного. Но у меня сложилось ощущение, что это стеб.
← →
Palladin © (2009-08-18 17:58) [89]
> [86] Smile (18.08.09 15:18)
хм... а почему ветке должно мешать жить участие в ней кучи модераторов?
ну и как бы... http://www.delphimaster.ru/forums.shtml#rule Рекомендуется: п.8 может и выстрелить ;)
← →
DVM © (2009-08-18 23:30) [90]
> Юрий Зотов ©
Небольшие замечания по коду DLL:
Отсутствует закрытие хендла ThreadHandle
Нету проверки на результат RegisterClassEx(), CreateWindowEx(), LoadBitmap()
← →
brother © (2009-08-19 05:28) [91]доводим код "до ума" и выпускам релиз ;)
← →
ZeroDivide © (2009-08-19 08:31) [92]На самом деле вся эта тема - туфта.
От тормозов, в том числе и при загрузке, нужно избавляться. Вон акробат ридер как шустро теперь запускается.... и спеш они больше не используют... а сколько их было, этих спешей у ридера.
← →
Andy BitOff © (2009-08-19 09:41) [93]
> ZeroDivide © (19.08.09 08:31) [92]
Так на то он и ридер. Его задача просто открыть документ. Какой там сплэш...
Сплэш, это не для красоты, а по нужде, но если без него не обойтись, то почему не сделать его красивым и качественным? Тем более, что чаще он делается для программ размер которых по сравнению с 400 килобайтным сплэшом, просто сравнивать не удобно.
Никто не утвердает, что давайте теперь клепать сплэши везде. Голову просто надо иметь... И каждому овощу освое время... и место.
← →
Andy BitOff © (2009-08-19 10:04) [94]400 кб имеется в виду, конечно, размер ехе с пустой формой и слэшем, т.е. надо вычесть размер пустой формы.
← →
Riply © (2009-08-19 10:13) [95]> [0] Юрий Зотов © (17.08.09 21:38)
> информация для использования в своих проектах всеми желающими.
Вот спасибо !
Уже года два откладываю написание этого "на потом" (эт такая знаменательная дата в календаре:) )
А тут все не только на блюдечке с голубой каемочкой,
а еще и реализовано, как мне хотелось :)
Еще раз спасибо :)
← →
Skyle © (2009-08-19 10:13) [96]
> Andy BitOff © (19.08.09 09:41) [93]
>
> > ZeroDivide © (19.08.09 08:31) [92]
>
> Так на то он и ридер. Его задача просто открыть документ.
> Какой там сплэш...
Всю дорогу этот бешенный ридер для простого открытия документа при запуске долго показывал сплеш и перечислял на нём загруженные DLL...
Где ZeroDivide увидел быстрый ридер я не знаю, видимо просто я последнии версии ещё не смотрел.
← →
Rouse_ © (2009-08-19 10:17) [97]
> Отсутствует закрытие хендла ThreadHandle
Зачем? ExitThread же присутствует.
← →
oxffff © (2009-08-19 10:25) [98]
> Rouse_ © (19.08.09 10:17) [97]
Terminating a thread does not necessarily remove the thread object from the operating system. A thread object is deleted when the last handle to the thread is closed.
← →
ZeroDivide © (2009-08-19 10:29) [99]
> Где ZeroDivide увидел быстрый ридер я не знаю, видимо просто
> я последнии версии ещё не смотрел.
Теперь он без сплешей, "пулей" запускается. Я сам был удивлен. Скачай 9-ку.
← →
Anatoly Podgoretsky © (2009-08-19 10:29) [100]> ZeroDivide (19.08.2009 08:31:32) [92]
И с элементами развлечения, некоторые пользователи просто млели.
← →
Anatoly Podgoretsky © (2009-08-19 10:30) [101]> Andy BitOff (19.08.2009 10:04:34) [94]
И получаем 380 кб
← →
Anatoly Podgoretsky © (2009-08-19 10:32) [102]> Skyle (19.08.2009 10:13:36) [96]
Так если нет надобности, как сейчас, то сделаем введением искуственных задержек, что нужность сразу была видна и по весу ощутима.
← →
oxffff © (2009-08-19 10:33) [103]
> Anatoly Podgoretsky
Остапа понесло.
← →
Palladin © (2009-08-19 10:33) [104]
> [99] ZeroDivide © (19.08.09 10:29)
тебя послушать, так можно подумать что сплеш все и тормозил... )
← →
ZeroDivide © (2009-08-19 10:39) [105]
> Palladin © (19.08.09 10:33) [104]
>
>
> > [99] ZeroDivide © (19.08.09 10:29)
>
> тебя послушать, так можно подумать что сплеш все и тормозил.
> .. )
Видимо сделали потоковую загрузку... оно как бы правильней, чем сплеши...
Основное окно и первая страница PDF грузятся, затем грузится все остальное... ну и инициализация всего и вся по мере необходимости. В общем, это намного правильнее чем сплеши. Приложение со сплешами раздражает.
← →
Andy BitOff © (2009-08-19 10:40) [106]
> Anatoly Podgoretsky © (19.08.09 10:30) [101]
> И получаем 380 кб
У меня 379 КБ (388 608 байт) ;Р
← →
Rouse_ © (2009-08-19 10:44) [107]
> oxffff © (19.08.09 10:25) [98]
И чего? У меня тоже есть чего доставить :)When this function is called (either explicitly or by returning from a thread procedure), the current thread"s stack is deallocated, all pending I/O initiated by the thread is canceled, and the thread terminates. The entry-point function of all attached dynamic-link libraries (DLLs) is invoked with a value indicating that the thread is detaching from the DLL.
← →
Andy BitOff © (2009-08-19 10:46) [108]
> ZeroDivide © (19.08.09 10:39) [105]
> Приложение со сплешами раздражает.
Никогда не говори никогда.
Если в вашей работе вам не попападалась задача (ваше приложение), которую просто нельзя загрузить за секунду, то это вовсе не означает, что ни у кого нет таких задач.
← →
oxffff © (2009-08-19 10:51) [109]
> Rouse_ © (19.08.09 10:44) [107]
>
> > oxffff © (19.08.09 10:25) [98]
>
> И чего? У меня тоже есть чего доставить :)
Но вызов GetExitCodeThread сработает. Значит поток не полностью удален.
Поэтому CloseHandle, CloseHandle.
← →
Rouse_ © (2009-08-19 10:51) [110]
> oxffff © (19.08.09 10:25) [98]
А вообще да... Хэндл таки не закрывается при ExitProcess. Вывод? Вывод - примеры из MSDN, наподобие нижеприведенного нагло врут :)
void CreateEventsAndThreads(void)
{
HANDLE hThread;
DWORD i, dwThreadID;
...
hThread = CreateThread(NULL,
0,
ThreadProc,
&ghReadEvents[i], // pass event handle
0,
&dwThreadID);
if (hThread == NULL)
{
printf("CreateThread failed (%d)\n", GetLastError());
return;
}
}
}
← →
Хитрий Лис (2009-08-19 10:54) [111]
> Andy BitOff © (19.08.09 10:46) [108]
> Если в вашей работе вам не попападалась задача (ваше приложение), которую просто нельзя загрузить за секунду, то это вовсе не означает, что ни у кого нет таких задач.
А попадаются еще такие задачи - которые на машине разработчика запускаются за 1 секунду, а на машине юзера с ненастроенной WindowsXP на 256М памяти запускаются секунд 30-40... ведь для запуска винде нужно сначала скинуть в своп десяток других запущенных программок :)
← →
Leonid Troyanovsky © (2009-08-19 11:10) [112]
> Rouse_ © (19.08.09 10:17) [97]
> > Отсутствует закрытие хендла ThreadHandle
> Зачем? ExitThread же присутствует.
ExitThread, как раз, лишний, а CloseHandle не хватает, утечка.
Мелочь, конечно, но не Пушкину ж это делать.
Еще, IMHO, некрасиво PostMessage WM_DESTROY,
тут просится PostThreadMessage WM_QUIT.
А вот потеря foreground - это всамделишний баг.
--
Regards, LVT.
← →
Andy BitOff © (2009-08-19 11:17) [113]
> Leonid Troyanovsky © (19.08.09 11:10) [112]
У меня потеря foreground решается так, как вы предложили в [71]
← →
Leonid Troyanovsky © (2009-08-19 11:25) [114]
> Andy BitOff © (19.08.09 11:17) [113]
> У меня потеря foreground решается так, как вы предложили
Твой пример я еще не успел посмотреть.
А у ЮЗ смутил stdcall, подумалось, что приложения могут быть и
недельфийские, поэтому и неуверенность насчет Application.Handle.
--
Regards, LVT.
← →
Andy BitOff © (2009-08-19 11:34) [115]
> Leonid Troyanovsky © (19.08.09 11:25) [114]
> Твой пример я еще не успел посмотреть.
Может лучше и не надо... =)
Или тогда хоть результаты лично, а то мне стыдно будет =)
← →
Leonid Troyanovsky © (2009-08-19 12:00) [116]
> Andy BitOff © (19.08.09 11:34) [115]
> Может лучше и не надо... =)
А чего страшного?
В ем, конечно, строк поболее, все внимательно трудно прочесть.
Но, пара-тройка вещей бросились в глаза:
В цикле выборки сообщений Sleep(0) лишний, GetMessage сделает.
Про DestroyWindow в msdn пишут, что не предназначена для
окон другого потока, наверное, лучше не рисковать.
Можно послать, например, WM_SYSCOMMAND SC_CLOSE.
Кста, про WM_SYSCOMMAND: must combine the value 0xFFF0 with the wParam
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2009-08-19 12:11) [117]> Palladin (19.08.2009 10:33:44) [104]
Почему бы и нет, ты видел их сплеши, например, который рисует поверх экрана, со сложными регионами.
← →
Leonid Troyanovsky © (2009-08-19 12:46) [118]
> Leonid Troyanovsky © (19.08.09 12:00) [116]
Вдогонку.
Такая вещь как FileExists совершенно бесполезна.
Нет смысла делать проверку, кидать собс-ное исключение, если
далее идет TFileStream.Create, который сам все сделает вовремя.
Порой же FileExists может быть и вредна, бо между ее вызовом
и тем моментом, когда на основе ее результата что-то делают
проходит не один кол времени.
Т.е., файл только что был и вдруг его нет, а ракеты полетели.
--
Regards, LVT.
← →
Andy BitOff © (2009-08-19 13:14) [119]
> Leonid Troyanovsky © (19.08.09 12:00) [116]
> В цикле выборки сообщений Sleep(0) лишний, GetMessage сделает.
Без слипа в однопроцессорных системах загрузка CPU 100%
> Про DestroyWindow в msdn пишут
Подумаю. Чёй-то сразу и не соображу =(
> Кста, про WM_SYSCOMMAND: must combine the value 0xFFF0 with
> the wParam
Хм... Так, что ли "if (wParam and $FFF0) = SC_CLOSE then"?
← →
Юрий Зотов © (2009-08-19 13:21) [120]> Andy BitOff © (19.08.09 13:14) [119]
1. GetMessage сам ожидает сообщения, поэтому Sleep в цикле выборки действительно не нужен. Причина 100%-ной загрузки в чем-то другом.
2. Говорят (сам не проверял), что вместо Sleep(0) лучше использовать SwitchToThread. Результат тот же, но якобы жрет меньше тактов.
← →
Leonid Troyanovsky © (2009-08-19 13:26) [121]
> Andy BitOff © (19.08.09 13:14) [119]
> Без слипа в однопроцессорных системах загрузка CPU 100%
Неа, ты чего-то путаешь.
> Хм... Так, что ли "if (wParam and $FFF0) = SC_CLOSE then"?
Да.
--
Regards, LVT.
← →
Andy BitOff © (2009-08-19 13:28) [122]
> Юрий Зотов © (19.08.09 13:21) [120]
Ну, я не знаю в чем может быть другом. С ним не грузит, без него грузит. На самом деле я даже проверить не могу, у меня нигде не грузит, но у меня нет и одноядерных/процессорных машин, просто поступали жалобы и методом анализа компьютеров выяснилось, что загружает там где одно...
> SwitchToThread
Мне не проверить. Конечно, полагаясь на ваш опыт я могу поставить не глядя.
← →
Andy BitOff © (2009-08-19 13:32) [123]Со SwitchToThread визуально работает без изменений ;)
> Leonid Troyanovsky © (19.08.09 12:46) [118]
> Такая вещь как FileExists совершенно бесполезна.
Да, действительно. Исправлю.
← →
Andy BitOff © (2009-08-19 13:34) [124]
> Юрий Зотов © (19.08.09 13:21) [120]
> GetMessage сам ожидает сообщения
Может у меня проблема в том что, он, собственно, и не успевает ждать? У меня сразу же стартует таймер.
← →
Дмитрий Белькевич (2009-08-19 13:38) [125]Есть два предложения по сплэшАм. Сейчас как-то всё однообразно - максимум - выпирающие куски картинки.
1. Вместо сплэша показывать порно. Тянуть картинки с какого-нить сайта. Успех гарантирован.
2. Поместить на сплэш какую-нибудь увлекательную игру. Тетерис, например. Состояние запоминать, и в следующую загрузку продолжать с того же места.
← →
Anatoly Podgoretsky © (2009-08-19 13:41) [126]> Andy BitOff (19.08.2009 13:28:02) [122]
Не грузит с ним, это обман зрения, просто нет других потоков, естественно управление постоянно и сразу отдается ему, а sleep(1) и другие ожидающие функции сбивают это поведение.
← →
Andy BitOff © (2009-08-19 13:47) [127]
> Anatoly Podgoretsky © (19.08.09 13:41) [126]
Анатолий, ну как я это объясню человеку, который нажимает CAD и видит в колонке CPU значение 100. Что мне ему сказать? Не верь глазам своим, слушай меня.
← →
Leonid Troyanovsky © (2009-08-19 13:48) [128]
> Anatoly Podgoretsky © (19.08.09 13:41) [126]
> Не грузит с ним, это обман зрения
А если грузит без него, то это значит через GetMessage
идет непрерывный поток сообщений и с этим надо
внимательно разбираться.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2009-08-19 14:09) [129]> Andy BitOff (19.08.2009 13:47:07) [127]
А ничего не надо говорить, не его это дело, но если тебя это беспокоит, то отдавай слайсы с помощью sleep(1) но это уже психологическое.
← →
Anatoly Podgoretsky © (2009-08-19 14:11) [130]
> Leonid Troyanovsky © (19.08.09 13:48) [128]
Это надо изменить структуру программы, а не маскировать это с помощью sleep
← →
Leonid Troyanovsky © (2009-08-19 16:23) [131]
> Anatoly Podgoretsky © (19.08.09 14:11) [130]
> Это надо изменить структуру программы, а не маскировать
> это с помощью sleep
Во, я, наконец, вспомнил, как его зовут - костыль!
Т.е., в релизах такого уже быть не должно.
--
Regards, LVT.
← →
Юрий Зотов © (2009-08-19 17:08) [132]> Andy BitOff © (19.08.09 13:32) [123]
> Со SwitchToThread визуально работает без изменений
То есть, со 100%-ной загрузкой CPU? Тогда все в порядке.
В доке сказано, что если в системе нет нуждающихся в CPU потоков, то SwitchToThread поток не переключит. Значит, в системе активно работает только один поток - Ваш. И система, естественно, отдает ему все процессорное время.
Никакого криминала в этом нет, так и надо объяснить юзеру. Появится второй активный поток - система начнет делить время. Например, пусть запустит несколько экземпляров программы и посмотрит, как раздаются слоны.
← →
Leonid Troyanovsky © (2009-08-19 19:19) [133]
> Юрий Зотов © (19.08.09 17:08) [132]
> То есть, со 100%-ной загрузкой CPU? Тогда все в порядке.
Чего ж тогда многопроцессорные не жалуются?
Тут, IMHO, стоит неспеша разобраться.
Хотя (т.к. я не запускал пример by Andy из-за большого кол-ва requried),
могу допустить, что все поглощает анимация.
--
Regards, LVT.
← →
Andy BitOff © (2009-08-19 19:28) [134]> Юрий Зотов © (19.08.09 17:08) [132]
> То есть, со 100%-ной загрузкой CPU? Тогда все в порядке.
Нет. У меня такой загрузки нет. Поэтому и проверить не могу.
← →
Leonid Troyanovsky © (2009-08-19 19:43) [135]
> Andy BitOff © (19.08.09 19:28) [134]
> Нет. У меня такой загрузки нет. Поэтому и проверить не могу.
А если заказать потокам процесса выполняться только на одном процессоре?
--
Regards, LVT.
← →
Andy BitOff © (2009-08-19 20:24) [136]> Leonid Troyanovsky © (19.08.09 19:43) [135]
Как?
Проверить смогу только завтра.
← →
Leonid Troyanovsky © (2009-08-19 20:34) [137]
> Andy BitOff © (19.08.09 20:24) [136]
SetAffinityMask?
--
Regards, LVT.
← →
Andy BitOff © (2009-08-19 20:42) [138]Спасибо. Завтра попробую.
← →
Loginov Dmitry © (2009-08-19 22:35) [139]> [88] Суслик_ (18.08.09 17:51)
Рад, что от разработки есть польза :)
Там косяк есть кстати: проверяется результат функции RegisterClass(),
однако результат 0 еще не свидетельствует об ошибке, нужно еще
GetLastError сравнивать с ERROR_CLASS_ALREADY_EXISTS, иначе после
черезы LoadLibrary / FreeLibrary перестает работать.
← →
Andy BitOff © (2009-08-20 10:16) [140]
> Leonid Troyanovsky © (19.08.09 20:34) [137]
Всё равно не выходит 100, максимум чего добиваюсь 40, в среднем 15-18. При обычном (без установки SetThreadAffinityMask) 2-5.
← →
Юрий Зотов © (2009-08-22 20:59) [141]> Rouse_ © (18.08.09 12:38) [63]
Думаю, ты все же неправ, Саид. RedrawWindow здесь не вызывается, а SetWindowPos работает ничуть не хуже ShowWindow и была использована для центрирования сплэша одновременно с его показом.
> DVM © (18.08.09 23:30) [90]
> Нету проверки на результат RegisterClassEx(),
> CreateWindowEx(), LoadBitmap()
Специально. Проверки подобного рода я считаю параноидальными, чем-то вроде этого:i := 3;
if i <> 3 then ...
Теоретически, присваивание тоже может не сработать, но вероятность этого слишком ничтожна, чтобы на нее закладываться и загромождать код проверками.
> Отсутствует закрытие хендла ThreadHandle
А вот за это спасибо. Действительно, упустил.
> All
Здесь приведен модифицированный вариант сплэша, в котором устранены отмеченные недостатки и решена проблема вывода главной формы программы на передний план:
http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=1411
Страницы: 1 2 3 4 вся ветка
Форум: "Прочее";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
Память: 0.85 MB
Время: 0.054 c