Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.10;
Скачать: CL | DM;

Вниз

Надо реализовать свои часы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.03 c
2-1155817627
Anonimus11
2006-08-17 16:27
2006.09.10
База данных


15-1155547420
Darkwing
2006-08-14 13:23
2006.09.10
Оценка труда программиста.


15-1155727986
Иксик
2006-08-16 15:33
2006.09.10
Сон


2-1155886701
Chort
2006-08-18 11:38
2006.09.10
EhLib


2-1156247678
deplhi
2006-08-22 15:54
2006.09.10
Расположение в памяти структур