Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
2-1156198672
Ref
2006-08-22 02:17
2006.09.10
DBGrid


2-1155815298
fast2
2006-08-17 15:48
2006.09.10
Что неправильно в условии:


15-1155708212
Furyz
2006-08-16 10:03
2006.09.10
MySQl


2-1156268259
ffo
2006-08-22 21:37
2006.09.10
(API) Не могу текст переместить в нужное место на форме


2-1156229174
0lmer
2006-08-22 10:46
2006.09.10
работа с файлами в windows на лету





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский