Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизНадо реализовать свои часы Найти похожие ветки
← →
Ega23 © (2006-08-17 12:28) [0]Предполагается, что трея не будет. Как лучше сделать?
← →
Ketmar © (2006-08-17 12:30) [1]да как угодно. %-) что, тебе тоже пояснять о телепатах и телепаторах? не стыдно? %-))
← →
Сергей М. © (2006-08-17 12:35) [2]
> Как лучше сделать?
Известно как - запуздырить)
← →
ORMADA © (2006-08-17 12:39) [3]запуздырить - лучший метод!
ничего лучше я ещё не видел!
выньАпи
SetTimer
KillTimer
← →
Ketmar © (2006-08-17 12:41) [4]> [0] Ega23 © (17.08.06 12:28)
возьми, да скачай у меня на сайте. ужо всё сделано. %-)
← →
Котик Б (2006-08-17 12:42) [5]Растет конкурент Casio с Orient-ом :)))
← →
Ega23 © (2006-08-17 12:49) [6]Каюсь, некорректно описал.
Разрабатывается АРМ. По системным настройкам будет запрещен показ Панели задач. При этом системное время надо всё-таки выводить.
Исходные данные: есть фрэйм с TLabel на который и надо выводить время. По таймеру - плохо, ибо основной процесс может подвисать на выполнение некоторых задач.
С потоками работал мало, поэтому и задаю вопрос в данной конфе.
Видится, что должен быть поток, который каждую секунду ... Вот что "он каждую секунду"? В Synhronize что-то делает? Что-то ещё?
← →
Ketmar © (2006-08-17 12:51) [7]> [6] Ega23 © (17.08.06 12:49)
с синхронизом не поможет, если основной поток задумывается. рисуй время средствами API, без синхрониза.
зыж а не проще сделать как я -- отдельной программой? пусть себе висит где-то в уголке экрана, да и всё.
← →
Сергей М. © (2006-08-17 12:54) [8]
> Что-то ещё?
>
Да, именно "что-то еще".
Создаешь поток (BeginThread), в теле поточной ф-ции создаешь окно (CreateWindow), стартуешь таймер (SetTimer) - и понеслось.
При этом ты никак не привязан к VCL и основному потоку, который может беспроблемно заниматься чем ему будет угодно.
← →
tesseract © (2006-08-17 12:59) [9]
> Создаешь поток (BeginThread), в теле поточной ф-ции создаешь
> окно (CreateWindow), стартуешь таймер (SetTimer) - и понеслось.
>
Рекомендуется изредка вызывать GetSystemTime, а то таймер иногда уходит при высокой загрузке проца (в 98 по крайней мере ).
ЗЫ: была у меня в студенческие времена прога для вывода текущего времени в заголовок окна, найду пошлю.
← →
begin...end © (2006-08-17 13:01) [10]> Сергей М. © (17.08.06 12:54) [8]
> в теле поточной ф-ции создаешь окно (CreateWindow)
Зачем?
:о)
> стартуешь таймер (SetTimer) - и понеслось.
При условии, что в потоке крутится цикл GetMessage/DispatchMessage.
:o)
← →
DiamondShark © (2006-08-17 13:03) [11]
> По таймеру - плохо, ибо основной процесс может подвисать
> на выполнение некоторых задач.
Ну и пусть.
Во-первых, юзер, обычно, занят решением прикладной задачи, а не на часики пялится, а, во-вторых, если прикладная задача ушла в глубокие раздумья, то юзеру всё равно курить, так что пофиг, сколько там времени.
← →
Сергей М. © (2006-08-17 13:04) [12]
> begin...end © (17.08.06 13:01) [10]
> Зачем?
На "своем" окне рисовать потоку гораздо проще и спокойней, нежели на чужом, тем паче - созданном и контролируемом VCL-контролом)
> При условии, что в потоке крутится цикл GetMessage/DispatchMessage
А никто и не возражает)
Без циклов подобных - хоть из штанов выпрыгни ! - никуда)
← →
clickmaker © (2006-08-17 13:07) [13]а почему бы в отдельном потоке просто не организовать цикл, в котором раз в секунду будет время обновляться?
типа
while (not Terminated) do begin
что-то там.Time := Now;
что-то там.Repaint;
Sleep(1000);
end;
← →
Ketmar © (2006-08-17 13:07) [14]> [11] DiamondShark © (17.08.06 13:03)
есть телепатическое подозрение, что это ещё и индикатор того, что софтине на ушла в полную нирвану навсегда. %-)
← →
Ketmar © (2006-08-17 13:08) [15]> [13] clickmaker © (17.08.06 13:07)
потому что отцы-основатели так делать не рекомендуют. %-) не факт, что случится ужос, но раз не рекомендуют -- лучше их послушать. %-)
← →
Ega23 © (2006-08-17 14:04) [16]Так что всё-таки лучше сделать?
← →
Ketmar © (2006-08-17 14:23) [17]> [16] Ega23 © (17.08.06 14:04)
медиаплейер. %-)
по теме: а что больше нравится. главное -- не синхрониз. %-)
я бы сделал поток с CreateWindow() -- так логичнее и реюзабельней.
← →
Ega23 © (2006-08-17 14:46) [18]
> я бы сделал поток с CreateWindow() -- так логичнее и реюзабельней.
Следующий вопрос: как это делать? Ситуация осложняется тем, что это должен быть именно фрейм в рамках основной формы. С возможностью "перетаскивания".
← →
guav © (2006-08-17 15:02) [19]"именно фрейм в рамках основной формы. С возможностью "перетаскивания"." делается на VCL как обычно, в него вставляется окно часов как WS_CHILD.
PS: Не следует забывать что VCL окна иногда пересоздаются.
← →
Ketmar © (2006-08-17 15:03) [20]при создании фрэйма запускать поток. поток будет делать окошко с родителем -- фрэймом. в общем, то же, что делают компоненты, только руками. %-)
см. параметер hWndParent в CreateWindow(). ну и -- явно обрабатывать нужные события (перерисовку, изменение размеров, etc...).
← →
Ketmar © (2006-08-17 15:04) [21]> [19] guav © (17.08.06 15:02)
да пусть себе пересоздаются. главное -- по WM_DESTROY не забыть завершить поток. %-)
← →
Ega23 © (2006-08-17 15:11) [22]Ага. Общая канва - ясна.
Что требуется для создания своего окна? Какие сообщения надо переопределять? WM_PAINT и WM_DESTROY - это я понял. Что ещё требуется?
← →
Ketmar © (2006-08-17 15:13) [23]> [22] Ega23 © (17.08.06 15:11)
да, в принципе, больше ничего. ну, WM_TIMER, если таймеры используешь. остальное можно смело отдавать виндам.
← →
Ketmar © (2006-08-17 15:14) [24]ещё неплохо бы предусмотреть обработку изменения размеров родителя, чтобы делать нечто типа дельфийского align/anchors.
← →
Ega23 © (2006-08-17 15:16) [25]
> ещё неплохо бы предусмотреть обработку изменения размеров
> родителя, чтобы делать нечто типа дельфийского align/anchors.
>
Нет, там фиксированный размер будет. Только изменение положения на экране.
← →
Ketmar © (2006-08-17 15:20) [26]> [25] Ega23 © (17.08.06 15:16)
тогда всё. изменение положения будет обрабатывать родитель, твоё дочернее окно двигаться не будет.
не забудь, что в главной процедуре потока надо делать стандартный цикл из GetMessage()/DispatchMessage(). %-)
← →
guav © (2006-08-17 15:29) [27][21] Ketmar © (17.08.06 15:04)
> главное -- по WM_DESTROY не забыть завершить поток. %-)
зачем завершать ? думаю, тут нужно переопределить метод пересоздания окна у VCL фрейма и передать хендл нового окна потоку (через сообщение потока), цикл GetMessage можно никогда не завершать.
← →
Ketmar © (2006-08-17 15:32) [28]> [27] guav © (17.08.06 15:29)
> GetMessage можно никогда не завершать
??? говорили же про фрейм. а вдруг фрейм помрёт? главное окно останется, а фрейма больше нет.
и вообще -- никогда не завершать подобный цикл есть порочная практика кодинга. за такое -- пожизненный эцих с гвоздями. %-)
← →
KyRo (2006-08-17 15:34) [29]А что нет готовых компонентов в сети типа компоненты часов в clr приложениях
← →
Ketmar © (2006-08-17 15:36) [30]> [29] KyRo (17.08.06 15:34)
а что, вопрос прочитать религия запрещает?
← →
TUser © (2006-08-17 15:41) [31]Оффтоп.
Моя первая поделка на Delphi - часики. С круглой формой аж поверх всех окон, стрелками и иконкой аж в трее. Движок в версии 5.0 (нехилые пацаки мало версий не лепят) выглядел вот так
procedure TTimeThread.Execute;
var i:integer;
st:string;
begin
i:=0;
while true do begin
inc (i);
if i=1000 then begin
i:=0; st:=TimeToStr(Time);
if st<>lasttime then begin
lasttime:=st;
// {synchronize(}drform;//);
synchronize(drform);
end;
end;
application.ProcessMessages;
end;
end;
:)))))))
← →
Ketmar © (2006-08-17 15:46) [32]> [31] TUser © (17.08.06 15:41)
тоже вариант. мои первые ещё ужасней были. %-)
← →
SergP © (2006-08-18 00:45) [33]> с синхронизом не поможет, если основной поток задумывается.
> рисуй время средствами API, без синхрониза.
А может лучше то что делается в основном потоке перенести в дополнительный?
Тогда часы можно будет реализовать в основном, да и прога сможет вовремя месаги обрабатывать (не будет задумываться и "подвисать")...
← →
SergP © (2006-08-18 00:49) [34]> [31] TUser © (17.08.06 15:41)
procedure TTimeThread.Execute;
...
application.ProcessMessages;
...
и работало?
← →
Ega23 © (2006-08-18 09:37) [35]
> А может лучше то что делается в основном потоке перенести
> в дополнительный?
> Тогда часы можно будет реализовать в основном, да и прога
> сможет вовремя месаги обрабатывать (не будет задумываться
> и "подвисать")...
Не, не получится. Ради часиков точно никто ничего переделывать не будет... :о)
← →
evvcom © (2006-08-18 10:40) [36]> [35] Ega23 © (18.08.06 09:37)
> Ради часиков точно никто ничего переделывать не будет...
А ради того, чтоб приложение не висело?
← →
DiamondShark © (2006-08-18 10:44) [37]У меня ощущение, что усилия неадекватны важности задачи.
← →
Ega23 © (2006-08-18 11:10) [38]
> А ради того, чтоб приложение не висело?
Да оно не особо и "висит". В принципе, на 99,99% случаев обычного таймера хватит.
Просто хочется "по уму" всё сделать...
← →
Ketmar © (2006-08-18 11:23) [39]> [38] Ega23 © (18.08.06 11:10)
"по уму" надо положить TLabel и TTimer. а то, что здесь наговорили -- это "по стопам доблестных китайских комсомольцев".
← →
Ega23 © (2006-08-18 11:56) [40]
> "по уму" надо положить TLabel и TTimer. а то, что здесь
> наговорили -- это "по стопам доблестных китайских комсомольцев".
>
>
Скажем так, это самый простой способ. В 99,99% будет работать. Хотелось изгольнуться и сделать "круто". После раздумий вчера пришёл к мнению, что сделаю именно Timer с Label... :о)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.046 c